当我编码时,我经常看到这样的东西:
testMyMethod() {
....
$mockMyServiceB
->expects($this->once())
->method('myMethodA')
->with(myvalue1, myvalue2, myvalue3)
->willReturn($someMockResult);
$myServiceA = new ServiceA($mockMyServiceB)
$results = $myServiceA->something();
$this->assertEquals(['resultA', 'resultB'], results);
}
不确定,但是我认为随着您编写越来越多的测试,这会使它们快速而又容易地失去可读性。您只是输入了太多信息(期望与回报混合在一起)。对于每个测试,您需要了解参数的顺序,期望,执行的顺序和返回值……。我想的太多了。
我当时正在考虑将代码移至只测试myMethodA正确使用的地方,然后再移至另一个只能关注结果的测试中,如下所示:
testMyMethodUseServiceBCorrectly() {
....
// this time no WillReturn, just focus on how is used
$mockMyServiceB
->expects($this->once())
->method('myMethodA')
->with(myvalue1, myvalue2, myvalue3);
$myServiceA = new ServiceA($mockMyServiceB)
$myServiceA->something();
}
testMyMethodUseServiceResults() {
....
// this time no Expects() or With(), just focus on results
$mockMyServiceB
->method('myMethodA')
->willReturn(myvalue1, myvalue2, myvalue3);
$myServiceA = new ServiceA($mockMyServiceB)
$this->assertEquals(['resultA', 'resultB'], $myServiceA->something());
}
我认为这可以清楚说明您要测试的内容,并可以进行较小的测试。但不确定是否也很常见.....是否建议这样做?
最佳答案
您仍然可以使用受保护的方法或私有方法来配置模拟。例如,我们有一个项目,该项目的class BaseTestCase extends TestCase
具有基本的createMock($classname)
方法,从中扩展了所有单元测试,以便为大多数Mock建筑使用提供一些代码。
只要记住用清晰的变量名和方法名来编写可读的测试代码,并在可能的情况下重用代码。
另外,请记住,如果您的测试越来越大,也许您需要重构您的课程并获得一些简化的服务。
关于php - 这种做法在phpunit上好吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45860513/