伪造RSpec和Capybara特征规范中的实例变量

时间:2015-06-08 15:35:50

标签: ruby-on-rails ruby rspec capybara

在我重构一些公司的旧代码之前,我试图设置一些功能规范。这是一种非传统的设置,但我能够找到足够的测试双打来绕过身份验证,足以开始。我仍然遇到的一个问题是视图需要绕过这些方法设置的一些实例变量,因此我得到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

编辑:有没有办法在功能规范中设置控制器上的实例变量?

2 个答案:

答案 0 :(得分:4)

没有简单的方法可以达到你想要的效果。

CrossType规范主要由Capybara处理,而不是RSpec。 Capybara在外部进程中运行大部分浏览器/ rails服务器行为。这使得从RSpec的观点来看它无法访问。因此,您不能以这种方式使用存根/双打。

功能规格主要是端到端验收测试。我们的想法是将您的系统视为使用您的系统的人。通常,在这些类型的规范中,您执行各种"工作流程"。这意味着,拥有规范,记录用户,导航到特定页面,填写表单,单击按钮和链接。然后,您通常会对视图中的内容产生期望。

这意味着您的规范看起来更像:

feature

答案 1 :(得分:0)

https://github.com/per-garden/fakeldap可以为您的功能测试提供足够的ldap功能。