BadMethodCallException:方法Mockery_0_Illuminate_Contracts_Events_Dispatcher :: listen()在此模拟对象上不存在

时间:2017-07-26 09:49:55

标签: php laravel unit-testing laravel-5

我正在进行一些单元测试,并希望测试这些基本的东西。在我的测试中我使用Illuminate\Foundation\Testing\WithoutEvents

当用户注册他或她获得激活邮件时。首先我使用了Observer,但得出的结论是,当使用WithoutEvents作为herehere时,Laravel不会禁用观察者。然后我将我的代码更改为“传统”事件和听众。

EventServiceProvider仍然是默认值,$listen属性除外:

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'App\Events\UserCreated' => [
        'App\Listeners\CreateActivation'
    ],
];

当我发送活动时:

event(new UserCreated($user));

示例测试(失败):

class ExampleTest extends TestCase
{
    use DatabaseMigrations, WithoutEvents;

    public function testExample()
    {
        $user = factory(User::class)->create();
    }
}

错误:

error

我不知道为什么它会崩溃。因为我不确定问题出在哪里。

1 个答案:

答案 0 :(得分:0)

正如之前在问题中所述,WithoutEvents并未禁用观察者。正如您在错误中看到的那样,问题不在于UserObserver或任何事件,而在于Sluggable包。该软件包也有一个观察者,这就产生了错误。

而不是$user = factory(User::class)->create();我在tests/TestCase.php中创建了一个函数,它创建了一个像这样的激活用户:

public function activatedUser($attributes = [])
{
    $user = factory(User::class)->create($attributes);

    DB::table('activations')->where('user_id', $user->id)->delete();

    return $user;
}

现在,在测试中,您可以创建激活的用户:$user = $this->activatedUser();