Entity framework 集成测试实体框架CRD操作

Entity framework 集成测试实体框架CRD操作,entity-framework,integration-testing,crud,Entity Framework,Integration Testing,Crud,在使用实体框架时,我正在努力进行集成测试 在我的测试项目中,我用测试数据为我的数据库播种,但我想知道您如何管理以测试创建、更新和删除操作 基本上我有我的测试数据,例如包含5个客户条目。。。我现在可以编写一些单元测试来获取基于这5个条目的数据。(例如,“全部获取”将返回包含5项的集合) 但是,如果我有一个删除1个客户的测试,这意味着GetAll测试需要5个客户,但只返回4个客户(如果这个测试是在删除测试之后执行的),并且失败了 你如何解决这个问题?在每次测试之前,你是否会给你的测试设定一个特定的顺

在使用实体框架时,我正在努力进行集成测试

在我的测试项目中,我用测试数据为我的数据库播种,但我想知道您如何管理以测试创建、更新和删除操作

基本上我有我的测试数据,例如包含5个客户条目。。。我现在可以编写一些单元测试来获取基于这5个条目的数据。(例如,“全部获取”将返回包含5项的集合)

但是,如果我有一个删除1个客户的测试,这意味着GetAll测试需要5个客户,但只返回4个客户(如果这个测试是在删除测试之后执行的),并且失败了

你如何解决这个问题?在每次测试之前,你是否会给你的测试设定一个特定的顺序,或者重新设定数据库的种子(但这听起来很糟糕?)


谢谢

一个有效的方法是使用。这基本上包装了所有sql调用,并回滚了在不调用Complete方法的情况下释放作用域时所做的更改。基本测试如下所示

public class TransactionalTestsBase
{
    private TransactionScope _scope;

    [TestInitialize]
    public void Initialize()
    {
        _scope = new TransactionScope();
    }

    [TestCleanup]
    public void TestCleanup()
    {
        _scope.Dispose();
    }

    [TestMethod]
    public void CrudAction()
    {
        var repo = new YourRepo();
        var client = ; // Make client
        repo.DeleteClient(client);
        Assert.AreEqual(4,repo.GetClients().Count());
    }
}
理想情况下,您将从这个基本测试类继承,而不是在其中编写测试


还有一些新的热度在测试版中,我认为这将在未来大大有助于这一点。查看一下

这样,创建/更新/删除操作就不会影响实际的数据库了吗?不,根本不会。它被包装在事务作用域中。这意味着只有在调用scope.Complete()时才会提交所有更改。由于我们从未提交范围并在每次测试后处理它,因此没有任何内容写入数据库。“由于我们从未提交范围并在每次测试后处理它,因此没有任何内容写入数据库。”因此,这不是集成测试。