我最后与我们的一位同事讨论了如何设置测试服务类的单元测试。
在设置测试用例时,我们中的一个建议模拟我们正在测试的实际类,而另一个则更喜欢创建类的实例并仅模拟依赖项。
所以我们假设我们正在测试SomeService
一种解决方案是模拟实际服务并测试模拟:
$firstDependency = //create mock for first dependency
$secondDependency = //create mock for second dependency
$this->someService = $this->getMockBuilder(SomeService::class)
->setMethods(null)
->setConstructorArgs(array($firstDependency, $secondDependency))
->getMock();
// continue testing $this->someService which is a mock
另一种解决方案是测试服务实例并仅模拟依赖项:
$firstDependency = //create mock for first dependency
$secondDependency = //create mock for second dependency
$this->someService= new SomeService($firstDependency, $secondDependency);
// continue testing $this->someService which is direct instance of SomeService
哪些解决方案被认为是最佳做法?
答案最好是参考官方的php-unit文档或其他可靠的来源。
答案 0 :(得分:2)
Don't mock class under test。不完全是 php-unit documentation ,但所有的点仍然有效。模拟SUT你最终测试模拟,而不是将在生产中使用的实际类。
答案 1 :(得分:1)
单元测试的目的是测试行为。模拟想要测试的对象实际上意味着您正在测试“伪造”行为。测试预定义行为的重点是什么?
答案 2 :(得分:0)
在测试抽象类的情况下,创建模拟被认为是一种很好的做法:
class AbstractClassTest extends PHPUnit_Framework_TestCase
{
/**
* Service under test in this case an abstract class
*/
$this->sut;
public function setUp()
{
$this->sut = $this->getMockForAbstractClass('My\Abstract\Class');
}
public function testMyAbstractClass()
{
$this->sut // do your test
}
}