我正在测试加载随机显示的“成员”样本的页面。 rails控制器将它们设置为@members
。在我的测试中,我尝试用单个硬编码成员哈希的数组替换此变量:
require "spec_helper"
describe "the page", type: :feature, js: true do
let!(:members) do
[{ name: "Super Grover", title: "Hero" }]
end
before do
visit "/the_page"
p members
expect(page).to have_content "some content"
end
it ... etc...
end
这是一项功能测试,因此Capybara会打开页面并引起点击。我在测试中添加了一张打印纸(p members
,在rails视图中添加了一张打印纸(p @members
)。 rails视图显示了在控制器(随机样本数组)中创建的值,但是测试显示了我用let
分配的值。
我的目标是使模拟值显示在页面上,而不是控制器实际发送的视图。我在想这个错误的方式吗?
答案 0 :(得分:1)
您的应用正在调用控制器,而控制器正在从某个地方(可能是模型?)获取@members,它没有使用您分配的值。您需要告诉它使用您的值,而不是自然得到的值,这是使用存根完成的。这也需要在调用页面之前发生。
let!(:members) do
[{ name: "Super Grover", title: "Hero" }]
end
it 'does things' do
allow(Member).to receive(:all).and_return(members)
visit "/the_page"
expect(page).to have_content "Super Grover”
expect(page).to have_content "Hero"
end
注意:如果您不拨打Member.all
,则需要用正在通话的电话替换:all
。
或者,如果您的成员是通过控制器方法(例如“ get_random_members”)调用的,则可以改为:
allow_any_instance_of(MembersController).to receive(:get_random_members).and_return(members)