在Laravel 4(Mockery)中嘲笑回调

 -而我知道阿信很忙 发布于 2023-02-08 22:47

我正在为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首先嘲笑这个方法.如果我exitforeach它之前包含一个它没有执行,表明它甚至没有在回调中运行任何东西.我知道这是默认行为,但我如何让Mockery运行相同/类似的回调?

我尝试过使用部分模拟,使用shouldExpect但不完全理解它.我也试过四处寻找,但这种情况没有运气.

如果我能学习如何在回调中使用嘲弄,那将会很棒.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有