模拟测试的服务或测试实例

时间:2016-03-30 12:43:02

标签: php unit-testing mocking phpunit

我最后与我们的一位同事讨论了如何设置测试服务类的单元测试。

在设置测试用例时,我们中的一个建议模拟我们正在测试的实际类,而另一个则更喜欢创建类的实例并仅模拟依赖项。

所以我们假设我们正在测试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文档或其他可靠的来源。

3 个答案:

答案 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
    }
}