如何防止laravel在测试中触发事件?

时间:2019-07-02 15:49:11

标签: php laravel laravel-5 eloquent

我刚刚写了一个laravel Observer。我想知道创建公司的用户,因此将其附加到Company模型中。我还有大量其他测试,这些测试使用工厂来建立公司。这些测试现在失败,因为观察者需要一个用户,但是在调用工厂时没有用户登录。

CompanyObserver.php

class CompanyObserver {
    function created(Company $company) {
        info('USER ' . Auth::user()->id . ' created the new company ' . $company->id . '.';
    }
}

OldTests.php

Class OldTests {
    function testSomething() {
        // Now fails because observer is triggered but no use is logged in.
        $company = factory(Company::class)->create();

        // Random request
        $this->post('getCompany/' . $company->id)->assertStatus(200);
    }
}

我该如何处理有一个新观察者,该观察者要求用户登录才能进行旧测试?我必须去更改所有旧测试吗?

1 个答案:

答案 0 :(得分:1)

在测试电话开始Event::fake();

这将伪造测试中的所有事件。 您可以在伪造的Event上使用断言函数来完成测试并查看事件是否被触发。

您可以像这样伪造特定范围的事件

$company = Event::fakeFor(function () {
    $company = factory(Company::class)->create();

    Event::assertDispatched(CompanyCreated::class);

    return $company;
});
//use $company for the rest of the test

有关伪造documentation中事件的更多信息