15

我试图让 Mockery 断言给定方法至少被调用一次。

我的测试课是:

use \Mockery as m;

class MyTest extends \PHPUnit_Framework_TestCase
{

    public function testSetUriIsCalled()
    {
        $uri = 'http://localhost';
        $httpClient = m::mock('Zend\Http\Client');
        $httpClient->shouldReceive('setUri')->with($uri)->atLeast()->once();
    }

}

如您所见,有一个测试(希望)创建了一个期望 setUri 将被调用的测试。由于没有涉及任何其他代码,我无法想象它可以被调用而我的测试通过了。谁能解释为什么?

4

3 回答 3

59

您需要致电Mockery:close()以验证您的期望。它还为下一个测试用例处理模拟容器的清理。

public function tearDown()
{
    parent::tearDown();
    m::close();
}
于 2013-04-30T20:53:32.750 回答
2

为了避免在每个测试类中调用 close 方法,您可以像这样将 TestListener 添加到您的 phpunit 配置中:

<listeners>
    <listener class="\Mockery\Adapter\Phpunit\TestListener"></listener>
</listeners>

这种方法在文档中进行了解释。

链接文档中要注意的一件事是:

确保 Composer 或 Mockery 的自动加载器存在于引导文件中,否则您还需要定义指向上述 TestListener 类文件的“文件”属性。

于 2016-03-27T14:58:18.033 回答
0

只是一个旁注:如果你使用 Laravel:make:test --unit 会生成一个测试类,它扩展了原始的 PhpUnit Testcase 类,而不是包含的 Tests\Testcase,它会加载 laravel 应用程序并运行 Mockery::close()。如果您在测试的单元中使用 Laravel 特定代码(如缓存、数据库或存储),这也是在某些情况下测试失败的原因。

因此,如果您需要使用 Laravel 特定代码测试单元,只需换出“扩展测试用例”,无需手动调用 Mockery::close()

于 2021-11-15T05:57:56.330 回答