我正在测试JSON API。直到最近,我假设记录按id排序。但是当Posts.all
变成Posts.where(user_id: params[:user_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)
添加到控制器的情况下成功了。我想确定它在那里。我该怎么办?
答案 0 :(得分:1)
订单无法保证,所以虽然你可能会得到按ID排序的结果的行为,但是不能保证,你不应该依赖它。
请参阅“Why is SSMS inserting new rows at the top of a table not the bottom?”
此外,因为它主要通过id返回,所以你的测试大部分都会在没有设置顺序的情况下成功,但它不会告诉你任何事情并且是不好的做法。
那么,你真的在问我是否做了一些不安全的事情,我怎么能写一个测试来检查是否有不良事件发生?
我不确定你为什么这样做。在数据库决定它想要的任何环境中,你都会遇到潜在的间歇性错误。即使它在您的测试环境中没有发生,也可能在生产中发生,因此它什么都不会告诉您。通过添加订单来删除错误,然后您的测试应该通过已知行为。