我已多次遇到这个问题,想知道我是否可以更轻松地解决这个问题。
我在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的每次调用编写一个特定的期望,以便能够设置那个。有没有更简单的方法?
答案 0 :(得分:0)
在#mockery IRC频道询问后,我得到了这个答案,它的确有效:ç
可以使用->andReturn()
(接受闭包),而不是使用普通->andReturnUsing()
,如下所示:
->andReturnUsing(function ($attr) {
if ($attr == 'pedidoline') {
return new \Illuminate\Support\Collection();
}
return 1;
});