我有些疑问要注入什么。给出以下代码:
class A
{
public function getSomething()
{
return 'something';
}
}
class TestMe
{
/**
* @var A
*/
private $a;
public function __construct($a)
{
$this->a = $a;
}
public function greetings()
{
return 'Hello, '.$this->a->getSomething();
}
}
我的测试A:
function testA()
{
$a = new class() {
public function getSomething()
{
return 'aAnonimus';
}
};
$sut = new TestMe($a);
$this->assertEquals('Hello, aAnonimus');
}
testB,相同,但带有模拟:
function testA()
{
$a = $this->createMock(A::class);
$a->method('getSomething')->willReturn('bMockery');
$sut = new TestMe($a);
$this->assertEquals('Hello, aMockery');
}
在第一个测试中,我只是注入一个普通对象。 但是第二个是Phpunit的方式:使用模拟对象。
问题是,从长远来看,谁会获胜?我发现了第一个挑战,对于第二个测试,您必须知道依赖项的类名(否则您将无法创建模拟)
答案 0 :(得分:0)
从长远来看,第二种方法更好,因为在构造函数中具有类型提示会更好,因为这将不允许您提供简单的对象。 同样,当我们谈论UnitTests时,您应该测试某个类而不依赖于第三方库或其他服务逻辑。因此最好的方法是对所有属于已测试类的服务使用模拟程序