首页 > 解决方案 > 无法模拟类:Mockery\Exception\InvalidCountException

问题描述

我尝试为我的 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 次。

我究竟做错了什么?

标签: laravelphpunitmockery

解决方案


您正在模拟整个班级,因此您的 scrape 方法中的代码不会运行。您必须进行部分模拟,以保留任何未明确模拟的方法。

编辑:

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

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

推荐阅读