在我看来,我有一个条件是基于我的应用程序控制器中定义的帮助程序方法,我将该方法定义为帮助程序方法。
<% if logged_in? %>
当我的规格达到此标准时,它说:
ActionView::Template::Error:
undefined method `logged_in?' for #<#<Class:0x007fdc06b71aa8>:0x007fdc0b9b0930>
当我使用浏览器时,它可以完美运行。我尝试对它进行存根,但是当我尝试在视图或控制器上存根时出现另一个错误。这是我的测试结果:
it "has a logout link" do
render
expect(rendered).to have_link "Logout"
end
这是我的gemfile:
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
答案 0 :(得分:1)
查看规范通常不需要调用真正的帮助程序(如果您不想测试该帮助程序,则可以制定一个帮助程序规范)。
仅存入helper方法以返回给定测试所需的值会更快,更容易:
context 'with a logged user' do
before(:each) do
allow(view).to receive(:logged_in?).and_return(true)
end
it 'has a logout link' do
render
expect(rendered).to have_link 'Logout'
end
end
context 'with no logged user' do
before(:each) do
allow(view).to receive(:logged_in?).and_return(false)
end
it 'has a login link' do
render
expect(rendered).to have_link 'Login'
end
end
在进行模型,控制器,视图,帮助器或任何其他隔离的测试时,由于它旨在快速运行,因此无法访问所有应用程序。例如:控制器测试默认情况下不渲染视图,模型规格仅测试模型,视图规格不具有请求上下文或会话上下文,等等。
您可以使用集成(功能)规范进行完整的真实用户测试,该规范从头到尾运行整个用户交互,并可以访问所有内容,甚至控制用户单击的内容。