【问题标题】:Facade mock called twice not overriding first?门面模拟调用两次而不是首先覆盖?
【发布时间】:2015-01-06 23:12:43
【问题描述】:

我正在使用 Laravel 并模拟一个 Facade 对象,例如

Confide::shouldReceive('user')->atLeast(1)->andReturn( (object) array('id' => 42) );
var_dump(Confide::user()->id); // returns int(42)
Confide::shouldReceive('user')->atLeast(1)->andReturn( (object) array('id' => 1) );
var_dump(Confide::user()->id); // returns int(42) but should be int(1)

但是var_dump(Confide::user()->id); 总是返回 42。即使第二个应该返回 1,因为我将它设置为 1

我做错了什么?

【问题讨论】:

    标签: php unit-testing laravel mocking


    【解决方案1】:
    Confide::shouldReceive('user')->atLeast(1)->andReturn(
        (object) array('id' => 42),
        (object) array('id' => 1)
    );
    

    所以这必须至少运行一次。

    第一次调用将返回一个带有id = 42 的对象,第二次和任何后续调用都将返回一个带有id = 1 的对象。

    PS:我从来没有使用过嘲弄,我只是查看了它的文档http://docs.mockery.io/en/latest/reference/expectations.html

    【讨论】:

    • 在第 3 次调用后是否有让它返回不同的值?它被称为很多。
    • @Steven 检查接受匿名函数的语法:andReturnUsing(closure, ...) 在提供的文档页面上。这样,您可以创建自己的计数器(或其他一些共享变量)并根据其值返回您需要的任何内容。或者,您可以使用 andReturnValues() 并使用 0..3 索引准备数组。
    • 我只是想弄清楚为什么再次调用它不会设置新值。我不太喜欢硬编码多次调用方法的想法。
    • @Steven:“为什么再次调用它并没有设置新值” --- 因为这个github.com/padraic/mockery/issues/401。使用“嘲笑应该接收覆盖”谷歌请求找到它
    • @Steven “我真的不喜欢硬编码多次调用方法的想法”——我认为它没有任何问题。这实际上是一个迹象,表明您的测试用例可能做得太多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多