2

在阅读了有关单元测试实体框架的几个问题/答案后,我决定放弃单元测试以进行集成测试。我的理念是,与 EF 上下文交互是一种“私人”操作,因为它不需要独立于我的服务进行单元测试,也不能轻松准确地被嘲笑。

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

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

void CreateUser(string username, string password);

我的测试程序集有一个 SetUpFixture(测试运行一次性),它创建我的数据库(EF 代码优先)和测试数据:

[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 方法运行创建我的数据库上下文的实例,该实例设置为在释放时回滚(在每次测试之后),并且还创建我的服务实例:

[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)在提交数据之前完成了它应该做的事情(我不希望它提交,以便我的数据库状态保持在它之前的初始化状态每次测试)?上面测试中的查询没有返回数据,因为它还没有提交。

4

2 回答 2

6

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

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

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

祝你好运,埃里克

于 2012-07-08T20:49:19.743 回答
2

这接近于我所有的自动化测试(我也不进行单元测试,只针对真实数据库进行集成测试)。我主要做两件不同的事情。

第一个是我在我的设置中设置了一个事务范围,并在我的拆解中处理它,而不提交。这允许我查询更新的数据 w 但能够恢复数据库以进行下一次测试。缺点是您可能无法在服务层中使用事务范围,因为我不知道嵌套事务的工作情况。

我做的另一件事是通过调用 EF 初始化类在启动时触发完整的数据库重建(我的 ATM 前面没有我的代码)。这样我就可以在测试运行开始时从种子数据中获得一个新的数据库,并且它也让我知道我的实体结构是否不好,

于 2012-07-09T03:04:38.950 回答