2016-03-21 32 views
1

我正在測試一個JSON API。直到最近,我還是假設記錄是按id排序的。但是,當Posts.all變成Posts.where(user_id: params[:user_id]),它打破了以下測試:如何測試數據庫記錄是否按ID排序?

it 'takes "limit" param' do 
    post1 = create :post 
    post2 = create :post, user_id: post1.user_id 
    get user_posts_path(post1.user_id, limit: 1) 
    expect(response.body).to be_json_eql([{id: post1.id}].to_json).including(only: :id) 
end 

我也許可以添加以下測試:

it 'returns records ordered by id' do 
    post1 = create :post 
    post2 = create :post, user_id: post1.user_id 
    get user_posts_path(post1.user_id) 
    expect(response.body).to be_json_eql([{id: post1.id}, {id: post2.id}].to_json).including(only: :id) 
end 

,但它成功不增加.order(:id)到控制器。我想確保它在那裏。我該怎麼辦?

+1

我認爲你的測試應該驗證行爲,而不是如何編碼。問題在於,你如何消除誤報? –

+0

當然,我不在乎控制器裏面有什麼,我想確保結果是按id排序的,總是不是。 –

回答

1

訂單不能保證,所以雖然您可能會得到按ID排序的結果的行爲,但不能保證,您不應該依賴它。

請參閱「Why is SSMS inserting new rows at the top of a table not the bottom?

而且,因爲它主要是由ID的回報,你的測試將大多沒有設置的順序會成功,但它會告訴你什麼是不好的做法。

那麼,你真的在​​問我是否做了一些不安全的事情,我該如何編寫一個測試來檢查結果是否發生了不好的事情?

我不知道爲什麼你會那樣做。在任何環境下,當數據庫決定需要時,都會出現潛在的間歇性錯誤。即使它不在測試環境中發生,也可能發生在生產環境中,所以它不會告訴你任何事情。通過添加訂單來消除錯誤,然後您的測試應該通過已知的行爲。

+0

我想要一個測試,確保在控制器中有'.order(:id)'。因爲如果沒有這樣的測試,'.order(:id)'可能會去一天,測試套裝不會失敗。否則我會在隨機的地方發生故障,測試其他的東西。換句話說,我不想做這個不安全的事情。我想確保我在做安全的事情。 –