【问题标题】:Mockery shouldReceive()->once() doesn't seem to work嘲弄 shouldReceive()->once() 似乎不起作用
【发布时间】:2013-04-08 18:28:28
【问题描述】:

我试图让 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 将被调用的期望。由于没有涉及任何其他代码,我无法想象它可以被调用而我的测试通过了。谁能解释一下为什么?

【问题讨论】:

    标签: php mockery


    【解决方案1】:

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

    public function tearDown()
    {
        parent::tearDown();
        m::close();
    }
    

    【讨论】:

      【解决方案2】:

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

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

      docs 中解释了这种方法。

      链接文档中需要注意的一点是:

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

      【讨论】:

      • PHPUnit 7 不再支持此功能
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-02-24
        • 1970-01-01
        • 2020-09-06
        • 2016-08-08
        • 2015-11-22
        • 2014-07-28
        • 2019-08-03
        • 2017-09-01
        • 2018-08-14
        相关资源
        最近更新 更多