pet*_*ing 4 php phpunit unit-testing mocking laravel
我有以下方法:
public function getThreads()
{
$results = \DB::select(\DB::raw(config('sql.messages.threads')), [$this->user->user_id]);
$messagesThreadsModel = app()->make(MessagesThreadsModel::class);
$messages = [];
foreach ($results as $r) {
$message = $messagesThreadsModel->find($r->messages_thread_id);
$message->unread = $r->unread;
$messages[] = $message;
}
return $messages;
}
Run Code Online (Sandbox Code Playgroud)
为了测试上面的内容,我模拟了调用 \DB::select (通过 Laravel 的外观)以返回对象列表,就像 DB 类通常所做的那样。然后我加载消息线程模型,该模型再次被模拟并在容器中替换(因此 app()->make() 将返回其模拟实例,而不是实际模型)。
最后这个:
$messagesThreadsModel->find($r->messages_thread_id);
Run Code Online (Sandbox Code Playgroud)
再次被模拟返回一个虚拟对象(存根?)。所有内容如下:
$threadsList = $this->mockThreads();
// mock the raw expression, check the query
\DB::shouldReceive('raw')->once()->with(m::on(function($sql)
{
return strpos($sql, 'messages') !== false;
}))->andReturn(true);
// mock the DB call, return a list of objects
\DB::shouldReceive('select')->once()->with(true, [$this->usersModel->user_id, $this->usersModel->user_id, $this->usersModel->user_id])->andReturn($threadsList);
$mockThreadResult = new \StdClass;
$mockThreadResult->last = "date";
$this->messagesThreadModel->makePartial();
// HERE IS THE TRICKY PART!
$this->messagesThreadModel->shouldReceive('find')->times(count($threadsList))->andReturn($mockThreadResult);
$this->app->instance('App\Freemiom\Models\Messages\MessagesThreads', $this->messagesThreadModel);
$messages = new Messages($this->usersModel);
$threadList = $messages->getThreads();
Run Code Online (Sandbox Code Playgroud)
现在的问题是什么?因为我传递了已经创建的虚拟对象,所以每次在循环中调用 ->find 方法时都会返回相同的对象。
我应该如何告诉 mockery 在每次调用时返回一个新对象?甚至有可能吗?或者也许我应该进行一些代码重构以使其全部可测试?
因此,为了能够在每次连续调用同一个模拟方法时返回一个新对象,我必须像这样使用andReturnUsing:
$this->messagesThreadModel->shouldReceive('find')->times(count($threadsList))->andReturnUsing(function()
{
$mockThreadResult = new \StdClass;
$mockThreadResult->last = "date";
return $mockThreadResult;
});
Run Code Online (Sandbox Code Playgroud)
这将模仿 Eloquent 模型的行为,该模型也使用 find() 方法返回新对象。
| 归档时间: |
|
| 查看次数: |
4127 次 |
| 最近记录: |