Rspec-在Rails视图中为实例变量分配了“ let”

时间:2019-01-01 00:19:33

标签: ruby-on-rails rspec

我正在测试加载随机显示的“成员”样本的页面。 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分配的值。

我的目标是使模拟值显示在页面上,而不是控制器实际发送的视图。我在想这个错误的方式吗?

1 个答案:

答案 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)