【问题标题】:Integration Testing a filter operation output for a store集成测试商店的过滤器操作输出
【发布时间】:2011-08-07 13:40:17
【问题描述】:

我想在我的商店过滤器上运行集成测试,例如

我按价格和不同的产品属性过滤

是否有关于如何在此类测试中断言的模式或最佳实践,我将举例说明:

假设我在我的测试数据库中调用 Repository.GetOnlyTShirtsWithColorRed() 我有所有可能的项目类型。

我可能会退还 1 件以上的物品,但我想断言它们都是 红色 并且都是 T 恤

我在许多书籍中读到循环和迭代在测试中的不良做法,但我还能如何断言我的代码没有出错,在更复杂的查询中这可能有助于捕获错误

【问题讨论】:

    标签: database design-patterns tdd integration-testing


    【解决方案1】:

    根据我的阅读 - 您想测试您的存储库实现是否适用于真实的数据库 - 也就是集成测试。

    如果上述情况属实,我认为您走在正确的道路上。我的断言可能看起来像

    Assert.That(shirtsFromRepo.All(shirt => shirt.Color == Colors.Red), "all shirts were not red!)
    

    至于“最佳实践”,能否发个链接?

    AFAIK 唯一的建议是避免代码中的复杂逻辑(例如 if 和其他控制结构)并在每次测试中测试一件事。

    【讨论】:

      【解决方案2】:

      对此进行测试的最佳方法是模拟存储库:通过将数据库(或 Web 服务等)替换为固定集合(数组、列表),您可以准确控制如何您的存储库中有许多红色 T 恤,因此您可以告诉您的测试确切地期待一个特定的集合。
      例如,在 C# 中,它可能如下所示:

      public void GetRedTShirts_ReturnsAllItems()
      {
          Shirt[] allShirts = { new Shirt(Red), new Shirt(Green), new Shirt(Red) }; //collection for mock
          // This depends on your mocking framework
          var mockShirtRepository = new Mock<Shirt>(allShirts); 
          var expectedCount = 2;
          // example of using dependency injection to replace the repository your controller would usually use in production, with a mock
          var businessLogic = new Controller(mockShirtRepository.object);
      
          var result = businessLogic.GetOnlyTShirtsWithColorRed();
          Assert.AreEqual(2, result);
      }
      

      这样,您可以使用确定性、已知的存储库来测试您的过滤逻辑,而不会被您的存储库破坏。

      【讨论】:

      • errr... 我认为 OP 想要测试存储库实现.. 所以嘲笑它违背了测试的目的。
      【解决方案3】:

      如果您想要实际测试存储库的实现,那么我建议您针对已知的罐装数据存储运行测试(即,您将在 shirts 表中有一组 T 恤,并且您将确切知道哪些衬衫是红色的),以便您可以断言存储库完全返回您期望的内容。

      但是,这样的测试很昂贵,而且本身并不是真正的单元测试。为了提高性能并将运行时间降低到可接受的值,您可能希望针对内存数据库运行,例如SQLite。它是免费的,顺便说一句。

      这样,您就不必循环或迭代测试。您只需调用您的存储库并验证结果:

      public void GetShirts_WithFilter_ShouldReturnFilteredResults()
      {
          var rep = new MyRepository(mySQLiteConnectionString);
      
          var redShirts = rep.GetShirts(shirt => shirt.Color == Color.Red); //For example
      
          Assert.AreEqual(3, redShirts); // I know there should be 3 red shirts in the table
      }
      

      或者,您可以准备一个集合(例如 IEnumerable of Shirt),其中包含您希望获得的确切衬衫列表,并断言这些列表具有相同的项目。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 1970-01-01
        • 2019-08-17
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        • 1970-01-01
        相关资源
        最近更新 更多