【问题标题】:How to test a feature that depends on date events happen?如何测试依赖于日期事件发生的功能?
【发布时间】:2012-03-16 03:40:55
【问题描述】:

我们如何根据某事发生的日期对某个功能进行验收/集成测试?

为简单起见,让我们假设这个特性:我们监控一个文件夹,并将项目添加到与接收到的文件相对应的 ListView 中。列表视图项目的颜色将取决于收到它的日期。比如说,如果是星期天收到,颜色是红色,星期一是蓝色,等等。

我们如何在不需要一周运行的情况下就该功能编写测试代码?测试代码是否应该修改系统日期(但我担心这会导致测试框架和报告的怪异)?有关信息,应用程序是 .net,开发人员使用 DateTime.Now 来获取接收时间。

注意这不是单元测试,这是模拟用户交互的验收测试。

【问题讨论】:

    标签: .net testing datetime acceptance-testing


    【解决方案1】:
    • 您将不得不使用可以存根 DateTime.Now 返回的内容而不需要接口的 Fake 框架。喜欢TypeMock
    • 否则,您可以创建自己的 Date 对象,以便更好地控制伪造(在这种情况下不太理想,因为它只是用于测试您的代码)
    • 否则,您可以创建一个具有可存根的 GetCurrentDate 方法的类。在您的产品实现中,您可以使用 DateTime.Now,但在您的测试中,您可以将其存根,以便它返回您想要的任何日期。 这可能是 IMO 的最佳解决方案

    但是,这不会测试完整、真实的实现,更像是一个单元测试。如果您确实在谈论端到端集成测试,那么是的,您需要修改系统时间。

    【讨论】:

      【解决方案2】:

      将您的时间更改为活动之前。

      【讨论】:

        【解决方案3】:

        您需要某种“模拟”DateTime 接口的方法——也就是说,使 DateTime 返回预定值而不是当前时间。 “注入”模拟类以替换现有模拟类的过程称为“依赖注入”(DI),执行 DI 的许多框架在以下位置进行了讨论:

        Which .NET Dependency Injection frameworks are worth looking into?

        【讨论】:

        • 但这是一个验收测试,而不是单元测试。如何将依赖项注入已编译的 .exe?
        【解决方案4】:

        如果是需要用户交互的验收测试,最好的办法是更改系统时间。

        如果是单元测试,需要将依赖(DateTime)传入要测试的方法中。

        【讨论】:

          猜你喜欢
          • 2015-03-08
          • 2010-11-19
          • 1970-01-01
          • 1970-01-01
          • 2021-12-09
          • 2019-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多