单元测试通用查询工厂

时间:2015-04-02 17:42:10

标签: c# unit-testing generics ninject

我已经为我正在处理的项目实现了命令/查询体系结构,但是在测试需要使用关联工厂的类时遇到了问题。我的架构基础可以在这里找到: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连线。

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

1 个答案:

答案 0 :(得分: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; }
}