【问题标题】:How to prevent Laravel event() from firing during unit tests如何防止 Laravel event() 在单元测试期间触发
【发布时间】:2020-02-25 05:01:40
【问题描述】:

我有一个类,它使用 Laravel 的全局 event() 函数在模型更改时触发单个事件。我能够防止在单元测试期间触发此事件的唯一方法是实际命名空间并在测试本身中声明一个新的 event() 函数,并使其不执行任何操作。它有效,但对我来说似乎不是一个很好的解决方案。我查看了 Laravel 文档,可以看到有些人在测试中成功使用了 Event::fake(),但是当我尝试这样做时,我得到:

BadMethodCallException: Method Mockery_0_Illuminate_Contracts_Events_Dispatcher::until() does not exist on this mock object

我在 Laravel 5.4 上。是否有更简洁的方法来防止此事件在测试期间触发?我真的不喜欢声明一个空的命名空间 event() 函数的想法。

编辑:

我正在测试的类是一个 UserDomain 类。在逻辑的一部分中,它调用了 Laravel 的全局 event() 方法:

event(new RoleChanged($this->user));

为了抑制它在测试中触发,我尝试了 Event::fake() 并且我还尝试了使用特征 WithoutEvents 及其 withoutEvents() 方法。两者都不起作用,并且我上面提到的相同错误两次都会发生。

【问题讨论】:

  • 显示您尝试使用的导致错误的原因

标签: php laravel phpunit


【解决方案1】:

你需要在你的测试中使用Illuminate\Foundation\Testing\WithoutEvents trait。

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutEvents;
use Illuminate\Foundation\Testing\RefreshDatabase;

class FooTest extends TestCase
{
    use WithoutEvents;
}

【讨论】:

  • 我试过了。它仍然返回相同的错误。我将在原始问题中添加更多信息。
  • @JoelJoelBinks 因为我不知道你实际上在做什么,所以我不能给你确切的答案。但是,我的答案是阻止事件触发的正确方法。我认为你在嘲笑这些事件或类似的东西。
  • 感谢您的帮助。无论出于何种原因,WithoutEvents 解决方案对我不起作用,但我的回答中的下面的 expectsEvents() 方法却可以。去图吧。
  • @JoelJoelBinks Wut?为什么你接受我的回答? ?
  • 哎呀 :) 抱歉。
【解决方案2】:

我阅读了更多关于在 Laravel 单元测试中模拟的文档,我发现我所要做的就是在测试开始时这样做:

$this->expectsEvents(RoleChanged::class);

这告诉框架承认这个事件发生了,但实际上并没有触发它。谢谢大家的帮助。它让我找到了一个可行的解决方案。

【讨论】:

    【解决方案3】:

    使用Illuminate\Foundation\Testing\WithoutEvents trait,并在任何测试之前放置$this-&gt;withoutEvents()

    <?php
    
    namespace Tests\Unit;
    
    use Tests\TestCase;
    use Illuminate\Foundation\Testing\WithoutEvents;
    
    class UsersTest extends TestCase
    {
        use WithoutEvents;
        
        /**
         * @test
         */
        public function email_is_required()
        {
             $this->withoutEvents();
             // assertions
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 2019-08-10
      • 2019-09-08
      相关资源
      最近更新 更多