我正在创建一个应用程序,它根据运行的日期创建不同的报告。
因此,如果它是星期一凌晨1点,它将创建一个周报告,如果是1月1日凌晨1点30分,它将创建一个月度报告。
我的初始方法使用一个类。它有一个属性,它是一个数组,它将每个报告映射到一个函数。调用脚本调用类上的run()方法,该方法依次遍历数组并为每个报告调用函数。
我该如何测试?我希望有一套不错的单元测试来涵盖计算。
我是否为每份报告创建了两个功能?一个从DB获取数据,另一个用于计算(可通过参数测试)。虽然这看起来很啰嗦!我会有24个函数而不是12个。
对最佳方法感到困惑。
谢谢!
编辑:为了澄清,脚本由cron作业运行,在上面提到的那些特定时间。我已经使用Reflection测试了时间检查代码(它根据时间设置运行模式)。我正在考虑完全取消课程的日期,并让调用脚本定义正在运行的报告。
答案 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)
虽然计算当前日期很简单,但我会将其从您的函数中删除,因此您可以在不更改代码的情况下测试日期的不同值。
我想到了两个选项。
或