c# - 集成测试 EF5(或 EF4x)

标签 c# asp.net-mvc-3 entity-framework unit-testing integration-testing

在阅读了几个关于 Entity Framework 单元测试的问题/答案后,我决定放弃单元测试转而进行集成测试。我的理念是与 EF 上下文交互是一种“私有(private)”操作,因为它不需要独立于我的服务进行单元测试,并且不能轻松准确地进行模拟。

注意:在我的示例中,我使用的是 EF5。

首先,我有一个创建用户的服务方法:

void CreateUser(string username, string password);

我的测试程序集有一个 SetUpFixture(一次性用于测试运行),它创建我的数据库(EF Code First)和测试数据:

[SetUpFixture]
public class SetUpFixture
{
    [SetUp]
    public void SetUp()
    {
        using (var context = new MyDbContext())
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>());

            // Set up a bunch of initial data and commit
        }
    }
}

然后在每次测试之前,我的 TestFixtureSetup 方法运行创建我的 DB 上下文的实例,它被设置为在处理时回滚(在每次测试之后),并且还创建我的服务实例:

[TestFixtureSetUp]
public virtual void TestFixtureSetUp()
{
    _context = new MyContext(rollbackOnDispose: true);
    UserService = new SignupService(_context);
}

[TestFixtureTearDown]
public virtual void TestFixtureTearDown()
{
    Context.Dispose();
}

最后,我进行了实际的集成测试,以确保传入了哪些有效数据,并创建了一条包含我的用户名的记录(这就是我的问题所在):

[Test]
public void ValidDataShouldResultInNewRecordWithUsername()
{
    SignupService.CreateUser("myuser", "fakepassword");

    var q = from user in Context.Users 
            where user.Username == "myuser"
            select user;

    var actualUser = q.Single();

    Assert.AreEqual("myuser", actualUser.Username);
}

这是我的问题:

1) 首先,这甚至是测试依赖于 EF 的服务的方法吗?我知道有几种方法,我只是想确保这种方法没有什么奇怪的。

2) 其次,我应该如何验证服务方法 (CreateUser) 在提交数据之前(我不希望它提交,以便我的数据库状态保持原样)完成了它应该做的事情在每次测试之前初始化)?上面测试中的查询没有返回任何数据,因为它还没有提交。

最佳答案

对于 #2,如果您使用的是 SQL Server,则可以使用 Snapshots .您在加载测试数据后创建快照。然后,您运行测试,并在拆解(或您使用的任何后期测试方法)中恢复到快照。恢复到快照非常 很快,因此这是测试数据库的实用方法。

还有另一种方法,我用过并取得了一些成功。不使用 SQL 数据库,而是使用 SQLCE 数据库。然后您可以将测试数据作为文件进行管理——无论如何您都在创建数据库。我更喜欢快照方法,但它们都有效。

对于 #1,这是一个集成测试。访问数据库是正确的做法,因为您正在测试应用程序的数据部分。抽象出一个存储库只会给你带来更多的复杂性,因为你需要根据数据库测试存储库。

祝你好运, 埃里克

关于c# - 集成测试 EF5(或 EF4x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11386449/

相关文章:

c# - 在应用程序运行时随时启动 Visual Studio Debugger

c# - 检索具有特殊字符的嵌入资源

asp.net-mvc-3 - Entity Framework 多对多

c# - EntityFramework Include (Eager Load) 虚拟属性的虚拟属性

c# - WinForms 中的 CKEditor 下拉工具栏未注册点击事件

c# - 使用固定装置测试 Entity Framework

jquery - MVC3 从数据表中编辑的行获取值

c# - Ninject、MVC5、EF6、存储库 + UoW

c# - 带有 Entity Framework 6 的 Oracle ODP.Net - 从 TableView 中选择时出现 ORA-00955

c# - 在 C# 中格式化带有有效数字的数字