【问题标题】:Integration Testing Entity Framework CRD operations集成测试实体框架 CRD 操作
【发布时间】:2013-05-01 17:16:31
【问题描述】:

我在使用实体框架时遇到了集成测试。

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

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

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

您如何解决此问题?您是否在每次测试之前为您的测试指定特定的顺序或重新植入数据库(但这听起来很糟糕?)...

谢谢!

【问题讨论】:

    标签: entity-framework integration-testing crud


    【解决方案1】:

    一个有效的方法是使用Transaction Scope。如果在未调用 Complete 方法的情况下处置了范围,这基本上会包装所有 sql 调用并回滚更改。基本测试将如下所示。

    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());
        }
    }
    

    理想情况下,您应该从这个基础测试类继承而不是在其中编写测试。

    测试版中仍有一些新的热度,我认为这将在未来对此大有帮助。看看Effort

    【讨论】:

    • SO 使用这个,CREATE/UPDATE/DELETE 操作不会影响实际数据库?
    • 没有。一点也不。它被包装在事务范围内。这意味着只有在调用 scope.Complete() 时才会提交所有更改。由于我们从不提交范围并在每次测试后将其释放,因此不会将任何内容写入数据库。
    • " 由于我们从不提交范围并在每次测试后将其处理掉。" 所以它不是集成测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多