【发布时间】:2014-09-05 19:50:57
【问题描述】:
我很乐意编写单元测试,但是当我一起运行它们时它们会发生冲突。我正在测试这个类:
class MyClass {
public function sayHello() {
return 'Hello world';
}
}
使用此测试。所有测试都有这样的结构:
class MyClassTest extends PHPUnit_Framework_TestCase {
private $subject;
public static function setUpBeforeClass() {
require_once('path/to/MyClass.php');
}
public function setUp() {
$this->subject = new MyClass();
}
public function testSayHello() {
$this->assertEquals('Hello world', $this->subject->sayHello());
}
}
MyClassTest 自己运行良好。但是如果另一个测试模拟 MyClass 并且碰巧首先运行,PHPUnit 会崩溃,因为我重新声明了该类:
class Inject {
private $dependency;
public function __construct(MyClass $myClass) {
$this->dependency = $myClass;
}
public function printGreetings() {
return $this->dependency->sayHello();
}
}
class InjectTest extends PHPUnit_Framework_TestCase {
public function testPrintGreetings() {
$myClassMock = $this
->getMockBuilder('MyClass')
->setMethods(array('sayHello'))
->getMock();
$myClassMock
->expects($this->once())
->method('sayHello')
->will($this->returnValue(TRUE));
$subject = new Inject($myClassMock);
$this->assertEquals('Hello world', $subject->printGreetings());
}
}
我确实使用 bootstrap.php 来伪造一些尚未重构的全局函数。
我没有自动加载程序,也不想处理隔离每个测试,因为这需要很长时间。我尝试在测试 1 和 2 的文档块中插入组合 @runTestsInSeparateProcesses 和 @preserveGlobalState enabled/disabled,我仍然得到相同的错误。
【问题讨论】:
-
你需要提供一个可重现的例子。
-
您为什么要通过
require_once语句设置您的模拟,而不是使用Mock Builder API 使用适当的模拟功能?阅读:phpunit.de/manual/current/en/… -
@hek2mgl,希望这个例子更好。
-
@MikeBrant,require_once 包括正在测试的主题,而不是模拟(使用 API 构建)。我已经更新了问题。
标签: php unit-testing phpunit