我应该创建额外的函数来使我的代码可测试吗?

时间:2015-04-27 17:42:12

标签: php unit-testing testing phpunit

我正在创建一个应用程序,它根据运行的日期创建不同的报告。

因此,如果它是星期一凌晨1点,它将创建一个周报告,如果是1月1日凌晨1点30分,它将创建一个月度报告。

我的初始方法使用一个类。它有一个属性,它是一个数组,它将每个报告映射到一个函数。调用脚本调用类上的run()方法,该方法依次遍历数组并为每个报告调用函数。

我该如何测试?我希望有一套不错的单元测试来涵盖计算。

我是否为每份报告创建了两个功能?一个从DB获取数据,另一个用于计算(可通过参数测试)。虽然这看起来很啰嗦!我会有24个函数而不是12个。

对最佳方法感到困惑。

谢谢!

编辑:为了澄清,脚本由cron作业运行,在上面提到的那些特定时间。我已经使用Reflection测试了时间检查代码(它根据时间设置运行模式)。我正在考虑完全取消课程的日期,并让调用脚本定义正在运行的报告。

2 个答案:

答案 0 :(得分:2)

当您尝试测试代码时,您总会发现自己处于这种情况:一个类有很多我想测试的私有函数。

你称之为“额外”功能,他们不是。只是如果你想要能够测试一些代码,它通常必须可以从测试中访问,并且可能以单独的类的形式访问。

这是我遵循的结构:

var pipeline = [
    {
        "$match": {
            "event_id": 342,
            "ticket_type": { "$in": [84, 45, 365] }
        }
    },
    {
         "$group": {
             "_id": null,
             "total": { "$sum": "$payment_amount" }
         }
    }
];
db.collection.aggregate(pipeline);

因此,计算是使用易于测试的类完成的。

为了测试每周工作日是否正在调用正确的方法,在测试中创建ReportGenerator时注入ReportCalculator类的模拟,并检查是否正在为每种情况进行正确的调用。

您还必须控制测试中当前的工作日。这可以通过使用你也可以模拟的DateProvider类,或者使用像命名空间覆盖这样的其他技巧来完成。

答案 1 :(得分:1)

虽然计算当前日期很简单,但我会将其从您的函数中删除,因此您可以在不更改代码的情况下测试日期的不同值。

我想到了两个选项。

  1. 使其成为函数的参数。因此,您可以通过使用不同的值调用函数来测试它。这样,不必等到特定时间才能测试代码。然后,通过使用不同的日期参数调用主代码来进行单元测试。
    1. 使日期逻辑成为一个单独的函数,因此您可以单独测试该日期逻辑。然后,让你的函数调用日期逻辑代码。