如果我在测试通过之后注释掉其中一个测试。但是,一起运行,最后一个将失败(即使我更改了测试顺序):
生产代码:
<?php
class View
{
private $filename;
private $data;
public function __construct($filename)
{
$this->filename = $filename;
$this->data = [];
}
public function __set($key, $value)
{
$this->data[$key] = $value;
}
public function render()
{
extract($this->data);
ob_start();
require_once $this->filename;
return ob_get_clean();
}
public function __toString()
{
return $this->render();
}
}
测试类:
require_once 'vendor/autoload.php';
use org\bovigo\vfs\vfsStream;
use org\bovigo\vfs\vfsStreamWrapper;
/**
* @outputBuffering enabled
*/
class ViewTest extends PHPUnit_Framework_TestCase
{
public function setUp()
{
vfsStream::setup();
}
/**
* @outputBuffering enabled
*/
public function testRenderSimpleView()
{
$fileContent = 'index file';
vfsStreamWrapper::getRoot()->addChild(
vfsStream::newFile('index.php')->withContent($fileContent)
);
$view = new View(vfsStream::url('index.php'));
echo $view->render();
$this->expectOutputString($fileContent);
}
/**
* @outputBuffering enabled
*/
public function testRenderViewWithData()
{
$filename = 'index.php';
$fileContent = '<?php echo $a; ?>';
vfsStreamWrapper::getRoot()->addChild(
vfsStream::newFile($filename)->withContent($fileContent)
);
$view = new View(vfsStream::url($filename));
$view->a = 1;
echo $view;
$this->expectOutputString('1');
}
}
测试输出:
PHPUnit 3.7.10 by Sebastian Bergmann.
.F
Time: 0 seconds, Memory: 3.75Mb
There was 1 failure:
1) ViewTest::testRenderViewWithData
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'1'
+''
FAILURES!
Tests: 2, Assertions: 2, Failures: 1.
这对我没有任何意义。我错过了什么?
答案 0 :(得分:0)
您是否尝试在执行测试后调用$ view-&gt; Dispose()?我不是vfsStream专家,但看起来文件在测试之间保持打开状态,如果当前文件位置在读取后没有倒回,它将保留在文件的末尾,导致第二次和后续测试失败
答案 1 :(得分:0)
当发生这种情况时,通常是因为您没有隔离正在测试的方法。换句话说,PHPUnit并不知道您指的是您正在测试(或类似)的某个方法的不同实例。因此,第二次测试总是失败。
如果您多次使用相同的方法,则应使用“at”声明,并在代码中执行正确的计数。这样PHPUnit知道你的意思,并且可以正确地满足期望/断言。
以下是多次使用方法“run”的一般示例:
public function testRunUsingAt()
{
$test = $this->getMock('Dummy');
$test->expects($this->at(0))
->method('run')
->with('f', 'o', 'o')
->will($this->returnValue('first'));
$test->expects($this->at(1))
->method('run')
->with('b', 'a', 'r')
->will($this->returnValue('second'));
$test->expects($this->at(2))
->method('run')
->with('l', 'o', 'l')
->will($this->returnValue('third'));
$this->assertEquals($test->run('f', 'o', 'o'), 'first');
$this->assertEquals($test->run('b', 'a', 'r'), 'second');
$this->assertEquals($test->run('l', 'o', 'l'), 'third');
}