单元测试实体框架

时间:2011-06-10 13:52:13

标签: .net linq unit-testing entity-framework repository

我刚刚开始使用Entity Framework(v4)和Linq。

我有一个Entity数据模型,它是从数据库生成的。然后,我实现了存储库类,以便为我的实体实现业务逻辑,并且它们包含用于与实体/数据库交互的LINQ查询。

在不访问数据库的情况下,对我的存储库类中的方法/函数进行单元测试的最简单最简单的方法是什么?

4 个答案:

答案 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"; }

但我更喜欢工厂的可重用性因素。