2015-04-02 107 views
1

我已经为我正在处理的项目实现了命令/查询体系结构,但是在测试需要使用关联工厂的类时遇到了问题。我的体系结构的基础上,可以在这里找到:https://cuttingedge.it/blogs/steven/pivot/entry.php?id=92单元测试通用查询工厂

特别是,我有类似以下

public interface IQueryFactory 
{ 
    TQuery CreateQuery<TQuery, TResult>() 
     where TQuery : IQuery<TResult>; 
} 

public interface IQuery<TResult> 
{ 
} 

public interface IQueryHandler<in TQuery, out TResult> 
    where TQuery : IQuery<TResult> 
{ 
    TResult Execute(TQuery query); 
} 

public interface IQueryHandlerFactory 
{ 
    IQueryHandler<TQuery, TResult> CreateQueryHandler<TQuery, TResult>() 
     where TQuery : IQuery<TResult>; 
} 

public class GetFooDataQuery : IQuery<IEnumerable<FooData>> 
{ 
    public int FooId { get; set; } 
} 

public class GetFooQueryHandler : IQueryHandler<GetFooDataQuery, IEnumerable<FooData>> 
{   
    private readonly IFooRepository _fooRepository; 

    public GetFooDataQueryHandler(IFooRepository fooRepository) 
    {   
     _fooRepository = fooRepository; 
    } 

    public IEnumerable<FooData> Execute(GetFooDataQuery query) 
    {   
     return _fooRepository.Foo.Where(x => x.fooId > query.FooId).ToList();    
    } 
} 

我的课需要查询数据库的东西有一个构造函数,包括查询工厂和查询处理工厂。一切都通过Ninject连接起来。

它工作正常,但我发现很难创建包含查询工厂的任何类的单元测试,因为我需要包含工厂作为构造函数的一部分。任何帮助将不胜感激。

回答

0

创建一个测试存储库,实现IFooRepository并将其传递给GetFooQueryHandler的构造函数。由于它是您的测试类,您可以将其设置为已知的测试值,以用于测试依赖于此的代码。

[TestMethod] 
public void TestMethod1() 
{ 
    var x = new GetFooQueryHandler(new TestFooRepository 
     { 
      Foo = new List<FooData>() 
     }); 
    var result = x.Execute(new GetFooDataQuery { FooId = 45 }); 

} 

class TestFooRepository : IFooRepository 
{ 
    public IEnumerable<FooData> Foo { get; set; } 
} 
+0

我可能不太清楚我的问题,我很抱歉。在测试依赖查询和查询处理程序的类时遇到问题。 它们的构造函数需要一个QueryHandlerFactory和一个QueryFactory。我需要能够实例化/模拟这些以测试业务逻辑。 虽然为IQueryHandlerFactory和IQueryFactory创建测试类,但遇到问题 – user2725951 2015-04-02 18:29:25

+0

如果您正在测试的代码实际上并未使用该依赖关系,则只需传递一个null。如果它使用依赖关系,则需要为这些接口创建测试类。你有什么问题创建这些类?如果你在你的测试类的界面上右击并选择“Implement Interface”,它是否实现了你可以使用的东西? – Grax 2015-04-02 18:53:12