2017-07-26 8 views
1

私はいくつかのユニットテストを行い、そのような基本的なテストをしたいと思います。私のテストでは、Illuminate\Foundation\Testing\WithoutEventsを使っています。BadMethodCallException:メソッドMockery_0_Illuminate_Contracts_Events_Dispatcher :: listen()がこのモックオブジェクトに存在しません

ユーザーが登録すると、アクティベーションメールが届きます。まず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

私はそれがクラッシュしている理由手掛かりをしたん。どんな助けも大歓迎です。また、より多くのコードを提供する必要がある場合は、私に知らせてください。なぜ私は問題が起こっているのか分からないからです。

+0

:あなたがアクティブにユーザーを作成することができますテストで、今ので

public function activatedUser($attributes = []) { $user = factory(User::class)->create($attributes); DB::table('activations')->where('user_id', $user->id)->delete(); return $user; } 

を>あなたのテストケースの '$ user = factory(User :: class) - > create();'の前に> withoutEvents(); ' – Maraboc

+0

私は '$ this-> withoutEvents()'に相当する 'WithoutEvents'特性を既に使用していますが、すべてのテストで使用しています。 –

答えて

0

前述のように、WithoutEventsはオブザーバを無効にしません。エラーでわかるように、問題はUserObserverやイベントではなく、Sluggableパッケージで確認できました。そのパッケージにはオブザーバーもあり、エラーが発生していました。

代わりの$user = factory(User::class)->create();私はそうのように起動し、ユーザー作成tests/TestCase.php内の関数を作成: `の$ this - を追加してみ$user = $this->activatedUser();

関連する問題