【发布时间】: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