【问题标题】:Unit Testing on a Repository with Generic Parameters使用通用参数对存储库进行单元测试
【发布时间】:2011-06-17 21:52:56
【问题描述】:

假设我有一个 Generic Repository 类,如下所示:

public class Repository<T> : IRepository<T> where T : class
{
    IObjectSet<T> source;
    public Repository(IUnitOfWork transactionHandler) 
    {
        source = transactionHandler.CreateObjectSet<T>();
    }

    public IQueryable<T> GetAll()
    {
        return source.AsQueryable<T>();
    }

    public void Add(T entity)
    {
        source.AddObject(entity);
    }
    //blah blah other methods
}

我无法思考如何(或者即使?)我会如何进行单元测试。 Visual Studio 为上述 GetAll 实现生成了我可以理解的测试组合

public void GetAllTest()
{
    GetAllTestHelper<SomeExpectedType>();//expect this to pass
    try 
    {
        GetAllTestHelper<SomeUnexpectedType>();//expect this to throw exception
    }
    //catch exception - check it is expected type etc. 
}

public void GetAllTestHelper<T>() where T : class
{
     IUnitOfWork transactionHandler = IUnitOfWorkFactory.GetUnitOfWork();
     Repository<T> target = new Repository<T>(transactionHandler);

     IQueryable<T> actual = target.GetAll();

     Assert.IsInstanceOfType(actual, typeof(IQueryable<T>));
}

想法是 - 我可以证明调用此方法会返回一个 T 类型的 IQueryable。我还可以证明它会为无法生成 IObjectSet 的类型(也是必需的/期望的)抛出 InvalidOperationException。

对于 Add 方法,我正在兜圈子。

对于“为什么”——为什么要进行测试——我想我想证明我可以将 T 类型添加到存储库中,然后证明它已添加到数据库中。

对于“如何” - 使用上面的 VS 默认值,我得到了一些类似于

的内容
public void AddTest()
{    
    AddTestHelper<SomeExpectedType>();
}

public void AddTestHelper<T>() where T : class
{
    IUnitOfWork transactionHandler = UnitTestHelper.GetUnitOfWork();
    Repository<T> target = new Repository<T>(transactionHandler);

    T entity = default(T);

    target.Add(entity);//throws exception - value cannot be null
}

所以我的问题是 a) 你将如何对这个存储库进行单元测试? 或者可能 b) 你会测试这个存储库吗?

【问题讨论】:

    标签: asp.net-mvc unit-testing repository


    【解决方案1】:

    a) 您将如何对该存储库进行单元测试?

    诸如Rhino MocksMoq 之类的模拟框架可以简化对此类进行单元测试的任务。它将用于模拟传递给存储库构造函数的IUnitOfWork 接口。

    例如,下面是使用 Rhino Mocks 对该存储库的 Add 方法进行典型单元测试的样子:

    [TestMethod]
    public void Add_Should_Use_AddObject_On_Underlying_Source()
    {
        // arrange
        var uofStub = MockRepository.GenerateStub<IUnitOfWork>();
        var objectSet = MockRepository.GenerateStub<IObjectSet<string>>();
        uofStub.Stub(x => x.CreateObjectSet<string>()).Return(objectSet);
        var sut = new Repository<string>(uofStub);
        var entity = "foo bar";
    
        // act
        sut.Add(entity);
    
        // assert
        objectSet.AssertWasCalled(x => x.AddObject(entity));
    }
    

    就 Visual Studio 生成的自动组合测试而言,恕我直言,这可能是 VS 中最无用的功能之一。

    b) 你会测试这个存储库吗?

    是的,绝对的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      相关资源
      最近更新 更多