2016-03-21 5 views
1

JSON APIをテストしています。そして最近まで、私はレコードが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 

は、私はおそらく次のテストを追加することができます:Posts.allPosts.where(user_id: params[:user_id])になったときにしかし、それは次の試験破った

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)'が1日かかるかもしれないので、テストスーツは失敗しないでしょう。あるいは、ランダムな場所で失敗し、他のものをテストします。言い換えれば、私は安全でないことをしたくありません。私は安全なことを確実にしたい。 –

関連する問題