[英]Is it worth writing a test for a method which has calls to other methods that are 100% covered by individual unit-tests?
最近,我一直在阅读Roy Osherove撰写的《单元测试的艺术》一书,当时我正在思考如何应对这种情况:
假设我有一个大方法可以通过完成不同的任务来基于传递的参数来完成业务流程:
public void MonsterMehtod(Parameters p)
{
// Some processes to accomplish TASK_A
// ....
// Some processes to accomplish TASK_B
// ....
// Some processes to accomplish TASK_C
// ....
}
我想在此方法上编写测试。
因此,如果我将这种大方法排除在较小的方法中,例如:
public void MonsterMethod(Parameters p)
{
Task_A(p);
Task_B(p); //Can behave different depending on Task_A(p) results
Task_C(p); //Can behave different depending on Task_A(p) and Task_B(p) results
}
我为每个任务编写单元测试,如下所示:
[Test]
public void Task_A_AllPossibleConditionsWithParameterP_ExpectedBehaviours() {}
[Test]
public void Task_B_AllPossibleConditions_ExpectedBehaviours()
{
// Tests all possible expected behaviours based on injected parameters
// Tests all possible expected behaviours based on method Task_A(Prameters p) results
}
[Test]
public void Task_C_AllPossibleConditions_ExpectedBehaviours()
{
// Tests all possible expected behaviours based on injected parameters
// Tests all possible expected behaviours based on method Task_A(Prameters p) results
// Tests all possible expected behaviours based on method Task_B(Prameters p) results
// Tests all possible expected behaviours based on method Task_C(Prameters p) results
}
因此,毕竟为MonsterMethod(Parameters p)编写另一个测试是否有意义,例如:
[Test]
public void MonsterMehtod_AllPossibleParameterConditions_ExpectedBehaviours {}
也许我至少可以编写一个测试来检查是否调用了所有Task_A(),Task_B(),Task_C()方法, 但是尽管我具有每个子任务的所有单元测试,还是值得进行另一个测试(也许应该被称为容纳所有这些子任务的MonsterMethod(Parameters p)的集成测试而不是单元测试?
如果您正在编写一个方法,那么它可能会与您已经拥有的任何其他方法有所不同。 然后测试它是否正确执行了其他操作(因为它正确组成了其他函数的结果)很有用。
您应该以期望的方式测试monster方法处理子任务的方式。 但是,这并不意味着您需要执行子任务。
我建议暂挂子方法,并单独测试Monster方法。
可以通过将每个Task方法虚拟化并使用模拟框架对子方法进行存根来轻松完成此操作,也可以自己手动进行。
我会说这是值得的。 如果最终删除了一些内部任务,那么您的Monster方法仍将进行测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.