为什么辅助方法在视图规范中不起作用?

the*_*dev 4 rspec ruby-on-rails

我的视图中有一个基于应用程序控制器中定义的辅助方法的条件,我将其定义为辅助方法。

<% if logged_in? %>
Run Code Online (Sandbox Code Playgroud)

当我的规范达到此要求时,它会说:

ActionView::Template::Error:
   undefined method `logged_in?' for #<#<Class:0x007fdc06b71aa8>:0x007fdc0b9b0930>
Run Code Online (Sandbox Code Playgroud)

当我使用浏览器时,它运行得很好。我尝试对其进行存根,但当我尝试在视图或控制器上对其进行存根时,出现另一个错误。这就是我的测试的样子:

it "has a logout link" do
  render
  expect(rendered).to have_link "Logout"
end
Run Code Online (Sandbox Code Playgroud)

这是我的宝石文件:

ruby "2.4.1"

gem "bootsnap", ">= 1.1.0", require: false
gem "coffee-rails", "~> 4.2"
gem "jbuilder", "~> 2.5"
gem "pg"
gem "puma", "~> 3.11"
gem "rails", "~> 5.2.1"
gem "rails-controller-testing"
gem "sass-rails", "~> 5.0"
gem "turbolinks", "~> 5"
gem "uglifier", ">= 1.3.0"

group :development, :test do
  gem "byebug", platforms: %i[mri mingw x64_mingw]
end

group :development do
  gem "listen", ">= 3.0.5", "< 3.2"
  gem "spring"
  gem "spring-watcher-listen", "~> 2.0.0"
  gem "web-console", ">= 3.3.0"
end

group :test do
  gem "capybara", ">= 2.15"
  gem "chromedriver-helper"
  gem "factory_bot_rails"
  gem "rspec-rails", "~> 3.7"
  gem "selenium-webdriver"
  gem "shoulda-matchers", "~> 3.1"
end
Run Code Online (Sandbox Code Playgroud)

And*_*rew 6

更新已接受的答案,现在似乎有必要使用without_partial_double_verification来绕过ActionView::Base does not implement: field_name错误。

示例代码:

let(:logged_in) { true }

before(:each) do
  without_partial_double_verification do
    allow(view).to receive(:logged_in?).and_return(logged_in)
  end

  render
end

it 'has a logout link' do
  expect(rendered).to have_link 'Logout'
end

context 'with no logged user' do
  let(:logged_in) { false }

  it 'has a login link' do
    expect(rendered).to have_link 'Login'
  end
end
Run Code Online (Sandbox Code Playgroud)