注意:我只发布这个问题,以便其他人可以在需要时找到它,因为我找到了一个很好的解决方案。
在我的控制器测试中,我不想提交数据库,但我仍然希望控制器使用finder方法来获取模拟对象(通过模拟find
方法),但是我想要在dom_id
中的这些模拟中使用assert_select
,以验证它们是否正在显示。
但是,由于它们是未保存的对象,因此dom_id
不断返回new_object
而不是object_1
,object_2
等等。
有没有快速的方法让它发挥作用?我真的不想在测试中坚持真实记录。
答案 0 :(得分:0)
假设您使用ActiveSupport::TestCase
和FactoryGirl
来构建模型对象,可以将其添加到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