Sam*_*amV 6 php unit-testing mockery laravel-4
我正在为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();
});
Run Code Online (Sandbox Code Playgroud)
而where应该调用的实际方法orWhere.注意:该构建器模拟传递给下面的类.
$builder = new LaravelBuilder($query);
Run Code Online (Sandbox Code Playgroud)
然后调用$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}%");
}
});
Run Code Online (Sandbox Code Playgroud)
主要部分是底部位$query->orWhere,PHPUnit测试每次都失败,因为它没有运行orWhere偶数一次.在您说它可能无法执行之前continue,我传递的数据将允许这样做.
我怀疑这是因为我where首先嘲笑这个方法.如果我exit在foreach它之前包含一个它没有执行,表明它甚至没有在回调中运行任何东西.我知道这是默认行为,但我如何让Mockery运行相同/类似的回调?
我尝试过使用部分模拟,使用shouldExpect但不完全理解它.我也试过四处寻找,但这种情况没有运气.
如果我能学习如何在回调中使用嘲弄,那将会很棒.
好吧,我认为这可以用更好的方法来完成,但我部分地模拟了 Laravel 的查询生成器。
参见第 324 行Illuminate\Database\Query\Builder
当使用闭包时,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();
})
);
});
Run Code Online (Sandbox Code Playgroud)
我需要使用makePartial()查询生成器保留其闭包的原始功能(这对于单元测试来说并不正确),所以这不是最好的解决方案。从这里,我模拟了newQuery被调用以生成新的查询构建器实例的方法,然后我以类似的格式模拟了该实例。