allow_any_instance_of并允许使用instance_double无法正常工作

时间:2016-09-04 09:36:12

标签: ruby-on-rails ruby rspec capybara-webkit

只是想问一下,在你使用allow_any_instance_of之前重构规范时是否遇到过这种情况,然后将其更改为allow它无法正常工作。正如我们在文档中所知,allow_any_instance_of已被弃用,他们鼓励我们使用allow。我仍然不知道为什么它不起作用。

是的,我不能在这里重现我的代码,因为这是公司自己的,但结构是这样的。

之前

feature `Something Page Spec here`, retry: 0, js: true do
  # some `let` here

  before do
    sign_in user
    setup_something_here
  end

  describe 'feature here' do
    let( :user ) { create( :user ) }

    before do
      allow_any_instance_of( ActionDispatch::Request ).to receive( :headers ) { { 'something' => 'here' } }
    end

    context 'something here' do
      # then some expectation here
    end

  end
end

之后

feature `Something Page Spec here`, retry: 0, js: true do
  # some `let` here

  before do
    sign_in user
    setup_something_here
    request = instance_double( ActionDispatch::Request )
    allow( request ).to receive( :headers ) { { 'something' => 'here' } }
  end

  describe 'feature here' do
    let( :user ) { create( :user ) }

    context 'something here' do
      # then some expectation here
    end

  end
end

当我在before中删除它时,我确实撬了我可以得到正确的值但是在after它已经是零。我很困惑为什么它不起作用。希望有些人可以帮助我解决这个困惑。谢谢!

2 个答案:

答案 0 :(得分:0)

它不起作用,因为你只创建了一个只存在于块之前的局部变量request

如果您希望这个工作,您还需要存根控制器request方法来实际返回此变量。

像这样的东西

request = instance_double( ActionDispatch::Request )
allow( request ).to receive( :headers ) { { 'something' => 'here' } }
allow_any_instance_of(YourRelatedController).to receive(:request).and_return(request)

答案 1 :(得分:0)

这里有一些问题

  1. 你不应该在功能测试中嘲讽/加倍,因为它会破坏功能测试的全部目的(这确实使其余的问题没有实际意义)

  2. allow_any_instance_of不被弃用,不建议使用它,因为在结构合理的测试中,99.9%的时间不需要它,但不会弃用

  3. 使用instance_double创建一个ActionDispatch :: Request实例 - 但它不是测试或应用中任何其他代码将要使用的实例。

  4. 目前还不清楚您的测试究竟在检查什么,但是,如果您正在尝试测试设置的标头可能更适合请求规范而不是功能规范,具体取决于具体规格标题及其目的是什么