在 RSpec 和 Capybara 功能规范中伪造实例变量
Faking instance variable in RSpec and Capybara feature spec
在我开始重构我公司的一些旧代码之前,我正在尝试设置一些功能规范。这是一种非常规的设置,但我能够充分了解测试替身以绕过身份验证以开始使用。我仍然遇到的一个问题是,在我绕过的这些方法中设置的一些实例变量是视图所期望的,所以我得到 undefined method for nil:NilClass
错误。在对程序代码进行任何更改之前,我想获得规格 运行。在这种情况下,我可以轻松地将特定实例变量移动到另一个方法。但我相信还会有更多这样的情况出现。这是我目前正在处理的示例:
def security_level
@right_now = Time.now
#
# other code that wont work without
# connecting to a remote authentication
# server
#
end
然后在我的规范中:
feature 'Navigation' do
before(:each) do
allow_any_instance_of(ApplicationController).to receive(:security_level).and_return(nil)
end
scenario 'is possible' do
visit root_path
expect(page.has_content?('Quick Stats'))
end
end
这是错误,来自视图@right_now.year
Failure/Error: visit root_path
NoMethodError:
undefined method `year' for nil:NilClass
# ./common/views/layouts/bootstrap/layout.haml:63
编辑:有没有办法在功能规范中设置控制器上的实例变量?
没有简单的方法可以完成您想要的。
feature
规范主要由 Capybara 处理,而不是 RSpec。 Capybara 在外部进程中运行大部分浏览器/rails 服务器行为。这使得 RSpec 无法访问它。因此,您不能以这种方式使用存根/双打。
功能规范主要是端到端的验收测试。这个想法是像那些会使用你的系统的人一样锻炼你的系统。通常,在这些类型的规格中,您执行各种 "workflows"。这意味着,拥有规范、登录用户、导航到特定页面、填写表格、单击按钮和链接。然后,您通常会对在视图中看到的内容做出期望。
这意味着您的规范看起来更像:
feature 'Navigation' do
let(:regular_user) { User.create!(name: 'A Regular User') }
def sign_in(a_user)
visit sign_in_url
# fill out form
click_button 'Sign In'
end
before(:each) do
sign_in(regular_user)
end
scenario 'is possible' do
visit root_path
expect(page.has_content?('Quick Stats'))
end
end
https://github.com/per-garden/fakeldap 可能会为您的功能测试提供足够的 ldap 功能。
在我开始重构我公司的一些旧代码之前,我正在尝试设置一些功能规范。这是一种非常规的设置,但我能够充分了解测试替身以绕过身份验证以开始使用。我仍然遇到的一个问题是,在我绕过的这些方法中设置的一些实例变量是视图所期望的,所以我得到 undefined method for nil:NilClass
错误。在对程序代码进行任何更改之前,我想获得规格 运行。在这种情况下,我可以轻松地将特定实例变量移动到另一个方法。但我相信还会有更多这样的情况出现。这是我目前正在处理的示例:
def security_level
@right_now = Time.now
#
# other code that wont work without
# connecting to a remote authentication
# server
#
end
然后在我的规范中:
feature 'Navigation' do
before(:each) do
allow_any_instance_of(ApplicationController).to receive(:security_level).and_return(nil)
end
scenario 'is possible' do
visit root_path
expect(page.has_content?('Quick Stats'))
end
end
这是错误,来自视图@right_now.year
Failure/Error: visit root_path
NoMethodError:
undefined method `year' for nil:NilClass
# ./common/views/layouts/bootstrap/layout.haml:63
编辑:有没有办法在功能规范中设置控制器上的实例变量?
没有简单的方法可以完成您想要的。
feature
规范主要由 Capybara 处理,而不是 RSpec。 Capybara 在外部进程中运行大部分浏览器/rails 服务器行为。这使得 RSpec 无法访问它。因此,您不能以这种方式使用存根/双打。
功能规范主要是端到端的验收测试。这个想法是像那些会使用你的系统的人一样锻炼你的系统。通常,在这些类型的规格中,您执行各种 "workflows"。这意味着,拥有规范、登录用户、导航到特定页面、填写表格、单击按钮和链接。然后,您通常会对在视图中看到的内容做出期望。
这意味着您的规范看起来更像:
feature 'Navigation' do
let(:regular_user) { User.create!(name: 'A Regular User') }
def sign_in(a_user)
visit sign_in_url
# fill out form
click_button 'Sign In'
end
before(:each) do
sign_in(regular_user)
end
scenario 'is possible' do
visit root_path
expect(page.has_content?('Quick Stats'))
end
end
https://github.com/per-garden/fakeldap 可能会为您的功能测试提供足够的 ldap 功能。