【问题标题】:Getting different consecutive values on php mockery在 php mockery 上获取不同的连续值
【发布时间】:2019-07-28 08:34:33
【问题描述】:

TLDR; 使用相同的参数调用嘲弄shouldReceive('method)` 时,如何第一次获得value1 和第二次获得value2

假设我有一个$order 对象,它使用getState() 方法实现了这个签名。

interface Order {
    public function getState();
}

现在,在单元测试中,我想使用 mockery 来模拟 $order 对象,以便在调用 getState

  • 第一次返回initialized
  • 第二次返回processing

好吧,我知道它可以针对使用...->with($param1)->andReturn... 的参数根据参数返回值不同的情况。

加上withConsecutive 似乎是在phpunit 上做的方式。我如何在嘲笑中实现这一点?我在 mockery doc 和 stackoverflow 上都找不到任何关于它的信息。

谢谢。

【问题讨论】:

    标签: php mockery phpunit


    【解决方案1】:

    我认为可以在 mockery 的 andReturnUsing 方法中使用 array_shift 的帮助来完成

    $orderStates = [
        'intially-order-was' => 'initialized',
        'then-order-becomes' => 'processing'
    ];
    
    $order
        ->shouldReceive('getState')
        ->andReturnUsing(function() use (&$orderStates) {
            return array_shift($orderStates);
    });
    

    【讨论】:

    • 这对我有用,但我不确定这是正确的方法还是有更好的方法。如果这是错误的,请告诉我。 :)
    • 嗯,这是我的回答过度设计了 :) 我想我用了额外的大脑。 @Matteo 的答案是正确的答案。 stackoverflow.com/a/55027266/1818631
    【解决方案2】:

    来自Declaring Return Value Expectations部分:

    可以为多个返回值设置期望。经过 提供一系列返回值,我们告诉 Mockery 要什么值 在每次后续调用该方法时返回:

    $mock = \Mockery::mock('MyClass');
    $mock->shouldReceive('name_of_method')
        ->andReturn($value1, $value2, ...)
    

    第一次调用将返回 $value1,第二次调用将返回 $value2。

    【讨论】:

    • 谢谢@Matteo 这就是答案。我一定是仔细阅读了我不好的文档。
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多