2017-07-26 50 views
1

我正在做一些單元測試,並且想測試這麼基本的東西。在我的測試中,我使用Illuminate\Foundation\Testing\WithoutEventsBadMethodCallException:方法Mockery_0_Illuminate_Contracts_Events_Dispatcher :: listen()在這個模擬對象上不存在

當用戶註冊時,他或她會得到一封激活郵件。首先,我使用了一個觀察者,但得出的結論是,當使用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

嘗試添加'$這個 - > withoutEvents();'在你的測試用例中'$ user = factory(User :: class) - > create();'! – Maraboc

+0

我已經在使用'WithoutEvents'特徵,它相當於'$ this-> withoutEvents()',但是對於所有的測試。 –

回答

0

正如問題中所述,WithoutEvents不禁用觀察者。正如你在錯誤中看到的那樣,問題不在於UserObserver或任何事件,而在於Sluggable包。該軟件包也有觀察員,這是創建錯誤。

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();tests/TestCase.php它創建一個激活的用戶,像這樣創建的函數$user = $this->activatedUser();

相關問題