【问题标题】:Cannot mock class: Mockery\Exception\InvalidCountException无法模拟类:Mockery\Exception\InvalidCountException
【发布时间】:2020-01-16 04:23:05
【问题描述】:

我尝试为我的 Laravel 6.0 应用程序运行 phpunit 测试,但在尝试模拟方法时,我收到此消息,因为它找不到类/方法:

Mockery\Exception\InvalidCountException:来自 Mockery_2_App_Http_Controllers_Scraper 的方法 scrapeGoogleData() 应该是 恰好调用了 1 次,但调用了 0 次。

我的测试代码是:

namespace Tests\Feature;

use Tests\TestCase;
use App\Http\Controllers\Scraper;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ScrapeTest extends TestCase
{
    use RefreshDatabase;

    /** @test */
    public function test_scrapeGoogleData() {
        $this->mock(Scraper::class, function ($mock) {
            $mock->shouldReceive('scrapeGoogleData')->once();
        });
        Scraper::scrape('www.google.com');
    }

“scrapeGoogleData”方法肯定会运行,因为它是从 Scraper::scrape 方法调用的。但是出于某种原因,嘲弄看不到这一点。我收到此错误:

Mockery\Exception\InvalidCountException:来自 Mockery_2_App_Http_Controllers_Scraper 的方法 scrapeGoogleData() 应该是 恰好调用了 1 次,但调用了 0 次。

我做错了什么?

【问题讨论】:

    标签: laravel phpunit mockery


    【解决方案1】:

    你在模拟整个类,所以你的 scrape 方法中的代码没有运行。您必须进行部分模拟,以保留未明确模拟的任何方法。

    编辑:

    你必须从容器中解决它,然后调用 scrape:

    app(Scrape::class)->scrape('www.google.com');
    

    【讨论】:

    • 添加 $mock->makePartial() 似乎也不起作用。
    • 你能发布你的抓取方法的正文吗?此外,如果它不是公共方法,您应该使用shouldAllowMockingProtectedMethods()
    • 类似于:class Scraper { public static function scrapeGoogleData($region, $keyword, $retries = 6) { $url = self::getGoogleURL($region, $keyword); ...返回($http_code == 200)? $内容:假; } }
    • 哦,我知道发生了什么事。您正在静态调用 scrape 方法。所以你基本上从不使用模拟。您必须从容器中解决它,然后调用 scrape:app(Scrape::class)->scrape('www.google.com')
    猜你喜欢
    • 2018-08-02
    • 2019-04-21
    • 2015-04-09
    • 2019-08-13
    • 2022-01-04
    • 2014-08-24
    • 2013-09-30
    • 2016-01-14
    • 2018-03-26
    相关资源
    最近更新 更多