【发布时间】:2017-11-06 03:28:53
【问题描述】:
我知道在method 中间创建Class 的实例是一种不好的做法,因为它会使代码难以测试。
但是我无法重构代码,所以我需要找到一种方法来模拟一个在被测method 中间使用new 创建的Object。
使用的框架:PHPUnit、Mockery、WP_Mock
示例:这里我需要从ExternalClass类的实例中模拟get_second_string()方法
Class MyClass {
function methodUnderTest($string) {
$objToMock = new ExternalClass();
$second_string = $objToMock->get_second_string();
$final_string = $string . $second_string;
return $final_string;
}
}
Class TestMyClass extends PHPUnit_Framework_TestCase {
public function setUp() {
}
public function tearDown() {
}
public function test_methodUnderTest() {
$externalObject = $this->getMockBuilder('ExternalClass')
->setMethods(['get_second_string'])
->getMock;
$externalObject->expects($this->once())
->method('get_second_string')
->willReturn(' two');
$testObj = new MyClass();
$this->assertEquals('one two', $testObj->methodUnderTest('one');
}
}
【问题讨论】:
-
不重构代码,你就不走运了。
-
@MagnusEriksson,您认为重构代码的最佳方式是什么?我看过xmike的回答,但看起来不是很清楚
标签: php testing phpunit mockery