如何测试数据库记录是否按ID排序?

时间:2016-03-21 12:28:04

标签: ruby-on-rails ruby postgresql testing

我正在测试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)添加到控制器的情况下成功了。我想确定它在那里。我该怎么办?

1 个答案:

答案 0 :(得分:1)

订单无法保证,所以虽然你可能会得到按ID排序的结果的行为,但是不能保证,你不应该依赖它。

请参阅“Why is SSMS inserting new rows at the top of a table not the bottom?

此外,因为它主要通过id返回,所以你的测试大部分都会在没有设置顺序的情况下成功,但它不会告诉你任何事情并且是不好的做法。

那么,你真的在​​问我是否做了一些不安全的事情,我怎么能写一个测试来检查是否有不良事件发生?

我不确定你为什么这样做。在数据库决定它想要的任何环境中,你都会遇到潜在的间歇性错误。即使它在您的测试环境中没有发生,也可能在生产中发生,因此它什么都不会告诉您。通过添加订单来删除错误,然后您的测试应该通过已知行为。