[英]Mocking callbacks in Laravel 4 (Mockery)
我正在为Laravel 4中的包编写测试。
我嘲笑Illuminate\\Database\\Query\\Builder
几乎一直都在工作,除非where
方法使用回调,我无法检查回调中的方法是否被调用。
我希望你们中的一个人可以解决一些问题。
$query = \Mockery::mock('Illuminate\Database\Query\Builder', function ($mock) {
/** @var \Mockery\Mock $mock */
$mock->shouldReceive('where');
$mock->shouldReceive('orWhere')->twice();
});
而实际的where
方法应该调用orWhere
。 注意:该构建器模拟传递给下面的类。
$builder = new LaravelBuilder($query);
然后调用$builder->filter()
,其中包含以下代码。
$this->query->where(function ($query) use ($filterData) {
/** @var \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $query */
foreach($filterData['columns'] as $colData) {
/** @var \Samvaughton\Ldt\Column $column */
$column = $colData['column'];
// See if this column is searchable
if (!$column->isSearchable() || !$colData['searchable']) continue;
// If the individual column term is empty, use the main term
$term = (empty($colData['term'])) ? $filterData['term'] : $colData['term'];
// Actually apply the filter
$query->orWhere($column->getSqlColumn(), "LIKE", "%{$term}%");
}
});
主要部分是底部位$query->orWhere
,PHPUnit测试每次都失败,因为它甚至没有运行orWhere
一次。 在你说它可能由于continue
而无法执行它之前,我传递的数据将允许这样做。
我怀疑这是因为我首先嘲笑where
方法。 如果我在foreach
之前包含一个exit
,则它不会执行,表明它甚至不会在回调中运行任何内容。 我知道这是默认行为,但我如何让Mockery运行相同/类似的回调?
我尝试使用部分shouldExpect
,使用shouldExpect
但不完全理解它。 我也试过四处寻找,但这种情况没有运气。
如果我能学习如何在回调中使用嘲弄,那将会很棒。
好的,所以我认为这可以用更好的方式完成,但我使用了部分模拟Laravel的查询构建器。
请参阅Illuminate\\Database\\Query\\Builder
第324行
使用闭包时,Laravel会生成一个新的查询构建器,该构建器也需要进行模拟。 这是有效的代码:
$query = \Mockery::mock('Illuminate\Database\Query\Builder', function ($mock) {
/** @var \Mockery\Mock $mock */
$mock->makePartial();
$mock->shouldReceive('where')->once()->passthru();
$mock->shouldReceive('newQuery')->andReturn(
\Mockery::mock('Illuminate\Database\Query\Builder', function ($mock) {
/** @var \Mockery\Mock $mock */
$mock->makePartial();
$mock->shouldReceive('orWhere')->twice();
})
);
});
我需要使用makePartial()
因此查询构建器保留了其原始的闭包功能(这不适用于单元测试),因此这不是最佳解决方案。 从这里我模拟newQuery
方法,该方法被调用以生成一个新的查询构建器实例,然后我以类似的格式进行模拟。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.