2015-10-12 34 views
10

我正在使用Codeception庫爲我的Laravel應用程序編寫測試。我正在使用Laravel5 module,並將它配置爲cleanup,這意味着所有測試都將在數據庫事務中運行,以便我的測試數據庫不會被測試數據填充。通過Codeception測試存在規則的Laravel 5路由

一個我測試的端點必須通過表單請求對設置了以下驗證規則:

public function rules() 
{ 
    return ['user_id' => 'required|exists:users,id']; 
} 

我寫張貼到這個端點的測試如下:

public function store(ApiTester $I) 
{ 
    // Create a couple of users 
    $users = factory(\App\Models\User::class, 2)->create(); 

    $I->wantTo('ask someone to be my friend'); 
    $I->authenticateAs($users[0]); 
    $I->sendPOST('users/' . $users[0]->id . '/friendships', [ 
     'user_id' => $users[1]->id 
    ]); 
    $I->seeResponseCodeIs(201); 
} 

此測試總是失敗。調查後,我可以看到它失敗,因爲該請求由於exists:users,id規則而失敗。如果我將Codeception設置更改爲不在事務內執行測試,則Laravel的驗證器可以成功查看我在測試開始時創建的兩個用戶的存在,並且測試通過。

所以,我的問題是,是否有任何方法可以維護將每個測試包裝在數據庫事務中的行爲,並讓Laravel的驗證程序能夠查看我在測試中創建的記錄?

+0

我有完全相同的問題任何幫助,將不勝感激 – Fabrizio

+0

你可以添加套件配置到你的問題? – Naktibalda

回答

4

問題是,如果未提交事務,則數據庫表中的原始數據不受影響。所以在這個事務中,你創建了兩個用戶,但是沒有任何提交語句會把它保存到你的數據庫中。因此,laravel驗證規則'exists'找不到它們(該規則使數據庫請求找到特定的user_id)。

所以在你的情況下,用戶必須在測試前存在。我會推薦使用遷移。 Resetting Database after each test

使用數據庫遷移和種子創建表並在測試完成後將其回滾。

+0

我希望能夠在每次測試之前避免遷移我的數據庫。看起來這與在交易中執行相比會有較高的性能損失。我真不明白的是,Laravel的驗證程序如何看不到我創建的用戶,Laravel和Codeception是否使用兩個不同的數據庫連接? –

0

報價:

$I->sendPOST('users/' . $users[0]->id . '/friendships', [ 
    'user_id' => $users[1]->id 
]); 

爲什麼你發送請求URL $users[0]->id,然後'user_id' => $users[1]->id中的參數?

這是你的問題嗎?這可能是你未通過驗證的原因嗎?

+0

這不是問題。此端點接受您要求成爲朋友的* another *用戶的用戶標識。 –