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的集成测试提供了一个薄薄的包装,
设计用于在整个堆栈中驱动行为,包括
路由