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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么辅助方法在视图规范中不起作用?相关的知识,希望对你有一定的参考价值。

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

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

查看规范通常不需要调用真正的帮助程序(如果您不想测试帮助程序那么您可以执行帮助程序规范)。

只需将助手方法存根以返回给定测试所需的值,就会更快更容易:

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

当您进行模型,控制器,视图,帮助程序或任何其他独立测试时,它无法访问所有应用程序,因为它旨在快速运行。例如:控制器测试默认情况下不渲染视图,模型规范仅测试模型,视图规范没有请求和会话的上下文等。

您可以使用集成(功能)规范进行完整的真实用户测试,这些规范从头到尾运行整个用户交互,可以访问所有内容,甚至可以控制用户点击的内容。

以上是关于为什么辅助方法在视图规范中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Onclicklistener 在片段列表视图中不起作用

Recyclerview 滚动在嵌套滚动视图中的片段中不起作用

java代码在片段活动中不起作用

实时数据中的 Observables 更新在片段中不起作用

可扩展列表视图在 android 的片段活动中不起作用

listview OnItemClick 侦听器在片段中不起作用