2011-06-17 38 views
1

比方說,我有沿着以下線通用倉庫等級:(?或者即使)我有麻煩纏繞我的腦海裏圍繞如何單元測試與泛型參數存儲庫

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 
} 

所以我的問題是 線東西)你會如何單元測試這個庫? 或可能的 b)你測試這個存儲庫?

回答

2

a)你會如何測試這個倉庫?

模擬框架如Rhino MocksMoq可以簡化單元測試這個類的任務。它將被用來模擬傳遞給存儲庫構造函數的接口IUnitOfWork

例如,以下是如何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)你會測試這個存儲庫嗎?

是的,絕對。