如何在Rails中的非保存/模拟对象上使用dom_id?

时间:2012-09-26 19:18:42

标签: ruby-on-rails unit-testing testing functional-testing

注意:我只发布这个问题,以便其他人可以在需要时找到它,因为我找到了一个很好的解决方案。

在我的控制器测试中,我不想提交数据库,但我仍然希望控制器使用finder方法来获取模拟对象(通过模拟find方法),但是我想要在dom_id中的这些模拟中使用assert_select,以验证它们是否正在显示。

但是,由于它们是未保存的对象,因此dom_id不断返回new_object而不是object_1object_2等等。

有没有快速的方法让它发挥作用?我真的不想在测试中坚持真实记录。

1 个答案:

答案 0 :(得分:0)

假设您使用ActiveSupport::TestCaseFactoryGirl来构建模型对象,可以将其添加到test/test_helper.rb文件中:

# Generate model with id - useful for assert_select with dom_id
def model(name, options = {})
  @next_id = {} if @next_id.nil?
  @next_id[name] = 1 unless @next_id.has_key(name)

  m = build(name, options)
  m.id = @next_id[name]
  @next_id[name] += 1
  m
end

然后,假设您使用RR作为模拟库,您可以执行以下操作:

test 'something' do
  posts = [model(:post), model(:post)]
  mock(Post).all { posts }
  get :index
  assert_select "##{dom_id(posts.first)}", posts.first.title
end