在EF4存储库中为以下GetMyObjectsFiltered(...)
方法编写单元测试的好方法是什么:
public static class MyRepository
{
public static List<MyObject> GetMyObjectsFiltered(string searchFilter)
{
var myQueryableObjects = GetMyObjects(searchFilter);
if (false == string.IsNullOrWhiteSpace(searchFilter))
{
myQueryableObjects = myQueryableObjects.Where(o => o.MyProperty.Contains(searchFilter));
}
return myQueryableObjects.ToList();
}
private static IQueryable<MyObject> GetMyObjects(string searchFilter)
{
using (MyDB_ModelContainer model = new MyDB_ModelContainer())
{
return model.MyTable.AsQueryable();
}
}
}
我可以在注入MyDB_ModelContainer
的同时仍然使用using
语句吗?
发布于 2011-09-23 07:44:40
最后,我重构了静态类,并在EF上创建了一个非常薄的层,它只返回IQueryable类型。这个类是通过接口实现的,然后可以使用Moles轻松地将其存根。下面的博客文章提供了完整的描述:
发布于 2011-09-20 09:00:42
你问的关于单元测试的问题是多么具有讽刺意味,而且你有一个静态的方法。
重读:Static methods are death to testability
也与你的问题有关..如果你没有业务逻辑,那么单元测试存储库代码就没有必要了,因为你基本上会把ORM作为单元测试的一部分来测试,这是不必要的,因为ORM编写人员已经处理好了。
如果您将静态方法重构为另一个接口实现,那么您可以模拟该接口的实现并将其注入到您的类中。模拟的实现将根据各种条件返回您想要测试的数据。
我建议你看看像moq这样的模拟框架。
因为它有业务逻辑,所以您可以将它移到表示它正在做什么的单独类中。那么您的repo可能仍然是接口,但您将修改新类将使用的数据。
发布于 2011-09-20 08:55:23
没有办法对存储库代码进行单元测试。存储库代码包装了数据访问,因此唯一合理的测试是与真实数据库集成=没有模仿或伪造,而是执行真实代码,并评估它是否从测试数据库返回了正确的结果。
https://stackoverflow.com/questions/7482465
复制