【发布时间】:2014-01-09 04:49:31
【问题描述】:
我目前正在为 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();
});
以及应该调用orWhere 的实际where 方法。 注意:该构建器模拟被传递给下面的类。
$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,但不完全理解。我也尝试过四处搜索,但没有运气。
如果我能学习如何在回调中使用嘲弄,那就太好了。
【问题讨论】:
标签: php unit-testing laravel-4 mockery