Ruby on rails 在RSpec和Capybara特性规范中伪造实例变量

Ruby on rails 在RSpec和Capybara特性规范中伪造实例变量,ruby-on-rails,ruby,rspec,capybara,Ruby On Rails,Ruby,Rspec,Capybara,在我开始重构公司的一些旧代码之前,我正在尝试设置一些特性规范。这是一种非传统的设置,但我能够了解到足够多的测试加倍,足以绕过身份验证来开始。我仍然面临的一个问题是,我正在绕过的这些方法中设置的一些实例变量是视图所期望的,因此我得到了nil:NilClass错误的未定义方法。我希望在对程序代码进行任何更改之前运行规范。在本例中,我可以轻松地将特定实例变量移动到另一个方法。但我相信还会出现更多类似的情况。以下是我目前正在研究的示例: def security_level @right_now =

在我开始重构公司的一些旧代码之前,我正在尝试设置一些特性规范。这是一种非传统的设置,但我能够了解到足够多的测试加倍,足以绕过身份验证来开始。我仍然面临的一个问题是,我正在绕过的这些方法中设置的一些实例变量是视图所期望的,因此我得到了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\u now.year

 Failure/Error: visit root_path
 NoMethodError:
   undefined method `year' for nil:NilClass
 # ./common/views/layouts/bootstrap/layout.haml:63

编辑:有没有一种方法可以从功能规范中设置控制器上的实例变量?

没有简单的方法可以实现您想要的功能

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

功能规格主要是指端到端验收测试。这样做的目的是像那些使用你的系统的人一样使用你的系统。通常,在这些类型的规范中,您可以执行各种“工作流”。这意味着,拥有规范、登录用户、导航到特定页面、填写表单、单击按钮和链接。然后,您通常会对视图中看到的内容做出预期

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

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

可能会为您的功能测试提供足够的ldap功能。

使用
let
关键字/方法。除了使用let关键字之外,我认为您希望实际返回一个时间,而不是零。这正是我所担心的。它使用一些跨多个应用程序共享的遗留代码来连接LDAP服务器。我可以设置一个单独的项目,按照您的建议完成完整的登录过程,但它需要将我自己的LDAP凭据保存在一个文件中。现在回到单元测试。如果不了解更多的代码,就很难给出建议。即使使用遗留代码,如果此部分相对隔离,也可能在中填充假服务。您可能需要在测试环境配置或初始值设定项中执行此操作。