Skip to content

[5.6] Allow faking events for only a specific part - #24230

Merged
taylorotwell merged 4 commits into
laravel:5.6from
arjanwestdorp:fake-for-method
May 18, 2018
Merged

[5.6] Allow faking events for only a specific part#24230
taylorotwell merged 4 commits into
laravel:5.6from
arjanwestdorp:fake-for-method

Conversation

@arjanwestdorp

Copy link
Copy Markdown
Contributor

Sometimes you want to fake the events for only a part of your test and not the whole test. For example to create some factories for models that rely heavily on events. We could need those events to be faked for that part, but not for the actual feature test we are performing.

In the example below the subscription would have some actions being performed through event listeners. For example a CreateUniqueNumberForSubscription and a CreateInvoiceForSubscription. When creating the factory subscription we don't want those events to be triggered, but when making a child subscription (the actual feature test) we want to dispatch all the events and test the result of those events being triggerd. For example by testing if the invoice was created correctly.

/** @test */
public function it_can_create_a_child_subscription() {
    $subscription = Event::fakeFor(function () {
        return factory(Subscription::class)->create();
    });

    $this->json('POST', '/subscriptions', [
        'parent_id' => $subscription->id,
    ])
        ->assertStatus(201);

    // assert this new created subscription has data filled by some event listener.
}

It would still have the possibility to only fake some events when passing those events to the second parameter:

Event::fakeFor(function () {
    return factory(Subscription::class)->create();
}, [OnlyThisEvent::class]);

And it also would still be possible to check if events are being dispatched on the EventFake inside of this fakeFor() callable:

Event::fakeFor(function () {
    return tap(
        factory(Subscription::class)->create(),
        function ($subscription) {
            Event::assertDispatched(OnlyThisEvent::class);
        }
    );
}, [OnlyThisEvent::class]);

@GrahamCampbell GrahamCampbell changed the title Allow faking events for only a specific part [5.6] Allow faking events for only a specific part May 16, 2018
@taylorotwell
taylorotwell merged commit 09d3473 into laravel:5.6 May 18, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants