我刚刚开始使用Entity Framework(v4)和Linq。
我有一个Entity数据模型,它是从数据库生成的。然后,我实现了存储库类,以便为我的实体实现业务逻辑,并且它们包含用于与实体/数据库交互的LINQ查询。
在不访问数据库的情况下,对我的存储库类中的方法/函数进行单元测试的最简单最简单的方法是什么?
答案 0 :(得分:3)
您可以针对内存数据库运行测试。 {{3P>
答案 1 :(得分:1)
找到一个允许您创建模型存储库的框架。这在开始时需要时间,但在长期运行中会得到回报。
答案 2 :(得分:1)
如果您可以将IDbSet
传递到它正在查询的存储库中,您可以轻松编写自己的IDbSet
存根实现,该实现可以读取和写入映射到内存的集合。 IQueryable
,或使用模拟框架为您完成。
在您的生产代码中,您从真实IDbSet
传入DbContext
;在您的测试代码中,您传入此存根。
如果您测试的存储库引用了DbContext
,那么您可能需要重构,以便它只引用个人IDbSet
。
答案 3 :(得分:1)
我假设您只是不想在测试中加载/保存任何实体(即:仅测试您的业务逻辑,而不是持久层)。在这种情况下,您将需要一种方法来轻松生成(并重复使用)测试“存根”。最简单的方法是为各种实体创建一些工厂,这些实体返回一些简单(但有意义)的实体。
例如,如果您正在测试您的用户引擎,您可能希望拥有一个生成不同类型用户的测试工厂,可能是来自威斯康星州的用户,或者具有非常长姓的用户,或者是没有用户的用户朋友,与有100个朋友的用户等。
public static class UserStubFactory {
static User NewUserWithLongLastName(int letterCount) { //return user with long last name }
static User NewUserWithXFriends(int count) { //return user w/ X friends }
}
然后,当您生成其他测试存根工厂时,您可以开始将它们链接在一起。因此,您可能希望测试具有长姓的用户,然后将其置于系统中的其他操作中。那么现在你已经有了TestStub,所以你可以简单地调用NewUserWithLongLastName()并通过你的引擎传递给他。
如果你不是这种方法,你也可以使用构造函数语法动态创建它们。
User newUser = new User() { LastName ="HOLYCOWTHISISAVERYYLONGLASTNAME"; }
但我更喜欢工厂的可重用性因素。