Php 我可以模拟我测试的类吗?
我有一门课是这样的:Php 我可以模拟我测试的类吗?,php,unit-testing,testing,phpunit,Php,Unit Testing,Testing,Phpunit,我有一门课是这样的: <?php class Apple { public function foo($arg1){ if ($arg1 == 0){ $this->bar($arg1); } } public function bar($arg){ //do something } } class AppleTest extends TestCase{ /**
<?php
class Apple {
public function foo($arg1){
if ($arg1 == 0){
$this->bar($arg1);
}
}
public function bar($arg){
//do something
}
}
class AppleTest extends TestCase{
/**
* it's unit test for method Apple::foo
*/
public function testFoo(){
$mock = $this->getMockBuilder('Apple')
->setMethods(['bar'])
->getMock();
$mock->expects($this->once())
->method('bar')
->with($this->equalTo(0));
$mock->foo(0);
}
}
有人告诉我,我不能对正在测试的类使用mock。我被告知应该使用类的实例而不是它的mock,因为当我使用mock时,它不是实际的测试。有人能反驳吗。不是你不能,而是你真的不应该。显然,通过示例测试,您可以模拟正在测试的对象 但这不一定是个好主意。这样做的问题是,您正在精确地指定代码应该是什么样子。这会使重构更加困难。假设bar函数需要更改,并且您希望将foo需要的功能移动到私有函数中。现在您的测试将失败,因为foo不再调用bar。在这种情况下,它应该通过,因为功能没有改变。这是单元测试的最大好处之一,您可以重构代码并确保事情仍然正常工作
但是,有时有必要模拟您正在测试的类。通常,这是当您试图为现有代码编写新的测试时,您无法将其重构为使用依赖项注入。然后,您将不得不模拟另一个函数以隔离对象。这并不理想,应该避免,但编写一个糟糕的测试可能比根本没有测试要好。模拟用于外部依赖项。模拟您正在测试的类毫无意义,因为您实际上不会测试您编写的单元测试代码之外的任何内容