仅在需要时设置特定的Mockery期望

时间:2014-07-07 12:23:13

标签: unit-testing laravel mockery

我已多次遇到这个问题,想知道我是否可以更轻松地解决这个问题。

我在Laravel 4 + Mockery中有一些控制器测试:

public function testShow()
{
    $nestedView = 'pedidos.show';
    $this->registerNestedView($nestedView);


    $this->mock
        ->shouldReceive('find')
        ->once()
        ->andReturn($this->pedidoModelMock);
    $this->pedidoModelMock
        ->shouldReceive('getAttribute')
        ->atLeast()
        ->once()
        ->andReturn(1);
    $this->pedidoModelMock
        ->shouldReceive('getAttribute')
        ->once()
        ->with('pedidol')
        ->andReturn(new \Illuminate\Support\Collection());

    $this->call('GET', '/clientes/1/pedidos/1');

    $this->assertResponseOk();
    $this->assertViewHas('pageAttributes');
    $this->assertViewHas('contenido');
    $this->assertNestedViewHas($nestedView, 'pedido');
}

在我看来,我有多条与这些相似的行:

          <div class="detail">
                <dt>Localidad</dt>
                <dd>{{{$pedido->loc}}}</dd>
            </div>
            <div class="detail">
                <dt>Provincia</dt>
                <dd>{{{$pedido->prov}}}</dd>
            </div>

这就是我用

模拟所有这些调用的原因
$this->pedidoModelMock
        ->shouldReceive('getAttribute')
        ->atLeast()
        ->once()
        ->andReturn(1);

问题是我后来在我的代码中有这个:

@foreach ($pedido->pedidoline as $line)
    <tr>
        <td>{{{$line->code}}}</td>
    </tr>
@endforeach

所以我需要为该特定电话返回不同的值。正如您在第一个代码片段中看到的那样,我尝试将一般期望与特定代码结合起来:

$this->pedidoModelMock
        ->shouldReceive('getAttribute')
        ->atLeast()
        ->once()
        ->andReturn(1);
    $this->pedidoModelMock
        ->shouldReceive('getAttribute')
        ->once()
        ->with('pedidol')
        ->andReturn(new \Illuminate\Support\Collection());

但它似乎不起作用。我被迫为getAttribute的每次调用编写一个特定的期望,以便能够设置那个。有没有更简单的方法?

1 个答案:

答案 0 :(得分:0)

在#mockery IRC频道询问后,我得到了这个答案,它的确有效:ç

可以使用->andReturn()(接受闭包),而不是使用普通->andReturnUsing(),如下所示:

->andReturnUsing(function ($attr) {
            if ($attr == 'pedidoline') {
                return new \Illuminate\Support\Collection();
            }
            return 1;
        });