gig*_*sey 2 php phpunit unit-testing mocking
码:
MyMockClass.php
<?php
class MyMockClass
{
public function __construct($l)
{
// Do nothing with it
}
protected function loadData($var)
{
// Do something, it doesn't matter what
return null;
}
public function onEvent($key)
{
return $this->loadData($key);
}
}
Run Code Online (Sandbox Code Playgroud)
MockTest.php
<?php
class MockTest extends \PHPUnit_Framework_TestCase
{
public function testPHPUnitMock()
{
$mock = $this->getMockBuilder('MyMockClass')->setConstructorArgs(array(true))->getMock();
$mock->expects($this->once())->method('loadData')->with('TEST')->will($this >returnValue(true));
$this->assertEquals(true, $mock->onEvent('TEST'));
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行此测试时,它失败,输出如下:
PHPUnit_Framework_ExpectationFailedException : Failed asserting that null matches expected true.
Expected :true
Actual :null
Run Code Online (Sandbox Code Playgroud)
我正在尝试执行onEvent,这反过来执行我嘲笑的功能,并改变了结果.但是这个onEvent功能似乎没有被调用.如果我把mail()(或类似的东西)放入onEvent,我不会收到任何邮件.
如果你没有告诉模拟构建器你将要模拟哪些方法 - 默认情况下将模拟模拟类中的所有方法.
在您的测试中调用onEvent方法的情况下,实际上您已经调用了一个模拟方法.
如果指定要模拟的方法,则模拟构建器将仅模拟这些方法,并将其余方法保留为原始类.
所以,尝试以这种方式构建你的模拟:
public function testPHPUnitMock()
{
$mock = $this->getMockBuilder('MyMockClass')
->setMethods(array('loadData')) // this line tells mock builder which methods should be mocked
->setConstructorArgs(array(true))
->getMock();
$mock->expects($this->once())->method('loadData')->with('TEST')->will($this >returnValue(true));
$this->assertTrue($mock->onEvent('TEST'));
}
Run Code Online (Sandbox Code Playgroud)