C# 通用查询工厂的单元测试

C# 通用查询工厂的单元测试,c#,unit-testing,generics,ninject,C#,Unit Testing,Generics,Ninject,我已经为我正在从事的一个项目实现了命令/查询体系结构,但在测试需要使用关联工厂的类时遇到了困难。我的架构的基础可以在这里找到: 特别是,我有以下类似的东西 public interface IQueryFactory { TQuery CreateQuery<TQuery, TResult>() where TQuery : IQuery<TResult>; } public interface IQuery<TResult> {

我已经为我正在从事的一个项目实现了命令/查询体系结构,但在测试需要使用关联工厂的类时遇到了困难。我的架构的基础可以在这里找到:

特别是,我有以下类似的东西

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连接起来


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

创建一个实现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; }
}

我的问题可能不够清楚,我道歉。我遇到的问题是测试依赖于查询和查询处理程序的类。他们的构造函数需要QueryHandlerFactory和QueryFactory。为了测试业务逻辑,我需要能够实例化/模拟它们。虽然我在为IQueryHandlerFactory和iQueryFactory创建测试类时遇到了问题,但是如果您正在测试的代码实际上没有使用该依赖项,只需传递null即可。如果它确实使用依赖项,则需要为这些接口创建测试类。创建这些类时遇到了什么问题?如果您右键单击测试类中的接口并选择ImplementInterface,它是否实现了您可以使用的东西?