Ruby on rails ';分配';在rspec capybara中未找到方法

Ruby on rails ';分配';在rspec capybara中未找到方法,ruby-on-rails,rspec,capybara,Ruby On Rails,Rspec,Capybara,我的控制器中有以下代码: private def remaining_words @remaining_words = Vocab.all.where.not(id: session[:vocab_already_asked]) @questions_remaining = @remaining_words.length - 4 @quiz_words = @remaining_words.shuffle.take(4) 这是我的测试: feature 'Quiz fu

我的控制器中有以下代码:

private
def remaining_words
    @remaining_words = Vocab.all.where.not(id: session[:vocab_already_asked])
    @questions_remaining = @remaining_words.length - 4
    @quiz_words = @remaining_words.shuffle.take(4)
这是我的测试:

feature 'Quiz functionality'   do
  scenario "gets 100% questions right in quiz" do
    visit(root_path)
    visit(start_quiz_path)

    assigns(:questions_remaining).length.to_i.times do
      orig_value = find('#orig', visible: false).value
      choose(option: orig_value)
      click_on('Submit')
      expect(page).to have_content('You got it right!')
      expect(page).not_to have_content('Sorry, wrong answer!')
    end

    expect(page).to have_content("Your score is 27/27")
    save_and_open_page
  end
end
我在运行测试时收到错误消息:

NoMethodError: undefined method `assigns' for #<RSpec::ExampleGroups::QuizFunctionality:0x007f8f2de3f2b0>
     # ./spec/features/quizzes_spec.rb:9:in `block (2 levels) in <top (required)>'
NoMethodError:未定义的方法“赋值”#
#./spec/features/quizzes_spec.rb:9:in'block(2级)in'
我还尝试使用controller.instance\u variable\u get(:剩余的\u单词)并获取此错误消息

NameError:
       undefined local variable or method `controller' for #<RSpec::ExampleGroups::QuizFunctionality:0x007fc4b99251a0>
name错误:
未定义的局部变量或方法“controller”#

我在设置测试时遗漏了什么吗?我是否应该使用descripe而不是feature来启用assign方法?

您正在编写的功能规格/集成测试无法访问控制器/控制器实例变量。它们更像是从用户角度执行的黑盒测试。设置测试数据时,您应该知道需要问多少问题,然后在测试中硬编码,或者更好的是,根据页面内容检测是否有更多问题需要回答(就像用户必须回答的那样).

您正在编写无法访问控制器/控制器实例变量的功能规格/集成测试。它们更像是从用户角度执行的黑盒测试。设置测试数据时,您应该知道需要问多少问题,然后在测试中硬编码,或者更好的是,根据页面内容检测是否有更多问题需要回答(就像用户必须回答的那样).

分配
仅在控制器测试中可用-在Rails 5中被折旧

测试您的控制器设置了哪些实例变量是一个坏主意 主意这大大超出了测试的范围 我应该知道。您可以测试设置了哪些cookie,哪些HTTP代码 返回视图的外观,或者数据库发生了什么变化, 但是测试控制器的内部不是一个好主意。
-大卫·海涅迈尔·汉森

在RSpec控制器规范中,包装不推荐的
ActionController::TestCase

控制器规范由
type::controller
元数据标识

RSpec.describe ThingsController, type: :controller do
  # ...
  describe "GET #index" do
  end
end
如果您设置了
config.infere\u spec\u type\u from\u file\u location
config.inference\u spec\u type\u from\u file\u location
RSpec将推断
spec/controllers
中的任何spec都具有
type::controller

您应该避免为新应用程序指定控制器规格,而应选择请求和功能规格。除了违反封装之外,控制器规范的一个主要问题是整个请求阶段都是存根的,请求实际上没有通过机架或路由,这可能会掩盖路由错误,这意味着机架中间件(如Warden(由Desive使用))或会话必须存根

如果您有一个遗留应用程序,您可以使用。如果你只是在学习RSpec,你应该选择更多最新的教程

功能规格是高级测试,旨在测试功能的各个部分 通过应用程序实现的功能。他们应该驾驶汽车 应用程序只能通过其外部接口,通常是网页。

将特性规格用于以用户故事为中心的高级测试。使用
RSpec.feature“新酷功能”
编写功能规范

请求规范为Rails的集成测试提供了一个薄薄的包装, 设计用于在整个堆栈中驱动行为,包括 路由(由Rails提供)和无存根(由您决定)。

使用
RSpec.description“Some resource”,键入::request
编写功能规范

请求规范对于测试API或当您只需要快速测试以确保数据库发生正确的突变或发送正确的http响应时是非常宝贵的

见:


分配
仅在控制器测试中可用-在Rails 5中折旧

测试您的控制器设置了哪些实例变量是一个坏主意 主意这大大超出了测试的范围 我应该知道。您可以测试设置了哪些cookie,哪些HTTP代码 返回视图的外观,或者数据库发生了什么变化, 但是测试控制器的内部不是一个好主意。
-大卫·海涅迈尔·汉森

在RSpec控制器规范中,包装不推荐的
ActionController::TestCase

控制器规范由
type::controller
元数据标识

RSpec.describe ThingsController, type: :controller do
  # ...
  describe "GET #index" do
  end
end
如果您设置了
config.infere\u spec\u type\u from\u file\u location
config.inference\u spec\u type\u from\u file\u location
RSpec将推断
spec/controllers
中的任何spec都具有
type::controller

您应该避免为新应用程序指定控制器规格,而应选择请求和功能规格。除了违反封装之外,控制器规范的一个主要问题是整个请求阶段都是存根的,请求实际上没有通过机架或路由,这可能会掩盖路由错误,这意味着机架中间件(如Warden(由Desive使用))或会话必须存根

如果您有一个遗留应用程序,您可以使用。如果你只是在学习RSpec,你应该选择更多最新的教程

功能规格是高级测试,旨在测试功能的各个部分 通过应用程序实现的功能。他们应该驾驶汽车 应用程序只能通过其外部接口,通常是网页。

将特性规格用于以用户故事为中心的高级测试。使用
RSpec.feature“新酷功能”
编写功能规范

请求规范为Rails的集成测试提供了一个薄薄的包装, 设计用于在整个堆栈中驱动行为,包括 路由