PHPUnit Mock似乎没有调用公共函数

时间:2014-01-03 10:38:30

标签: php unit-testing mocking phpunit

代码:

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);
    }
}

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'));
    }

}

当我运行此测试时,它失败,输出如下:

PHPUnit_Framework_ExpectationFailedException : Failed asserting that null matches expected true.
Expected :true
Actual   :null

我正在尝试执行onEvent,而onEvent依次执行我嘲笑过的函数,并改变了结果。但mail()函数似乎没有被调用。如果我在onEvent中添加{{1}}(或类似内容),我就不会收到任何邮件。

1 个答案:

答案 0 :(得分:5)

如果你没有告诉模拟构建器你要模拟哪些方法 - 默认情况下,模拟类中的所有方法都将被模拟。

在您的测试中调用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'));
}