RSpec之前是帮手

时间:2017-01-24 12:20:33

标签: ruby-on-rails ruby rspec helper

是否可以做这样的事情?

module MyHelper
  before (:each) do
    allow(Class).to receive(:method).and_return(true)
  end
end

然后在我的测试中,我可以做类似的事情:

RSpec.describe 'My cool test' do
  include MyHelper
  it 'Tests a Class Method' do
    expect { Class.method }.to eq true
  end
end

编辑:这会产生以下错误:

undefined method `before' for MyHelper:Module (NoMethodError)

基本上我有一个案例,其中许多测试做不同的事情,但是它们之间的共同模型对after_commit做出反应,最终总是调用一个与API对话的方法。我不想全球允许Class接收:method,因为有时我需要自己定义特殊情况...但我不想重复我的允许/接收/并且返回而是将其包装在一个共同的帮手......

3 个答案:

答案 0 :(得分:6)

您可以创建hook that is triggered via metadata,例如:type => :api

RSpec.configure do |c|
  c.before(:each, :type => :api) do
    allow(Class).to receive(:method).and_return(true)
  end
end

在您的规范中:

RSpec.describe 'My cool test', :type => :api do
  it 'Tests a Class Method' do
    expect { Class.method }.to eq true
  end
end

您还可以将:type => :api传递给单个it块。

答案 1 :(得分:1)

可以使用名为shared_context

的功能执行您想要的操作

您可以使用此代码

创建共享文件

<强> shared_file.rb

require 'rails_helper'
require 'shared_file'

RSpec.describe 'My cool test' do
  include_context "stubbing :method on Class"
  it 'Tests a Class Method' do
    expect { Class.method }.to eq true
  end
end

然后你可以将这个上下文包含在你想要的块中所需的文件中

<强> your_spec_file.rb

@Creatable

对于RSpec而言,它比你的包含/扩展模块助手更自然。这将是&#34; RSpec方式&#34;让我们说吧。

答案 2 :(得分:0)

您可以将该代码分成shared_context,并将其包含在示例组(不是示例)中,如下所示:

RSpec.describe 'My cool test' do
  shared_context 'class stub' do
    before (:each) do
      allow(Class).to receive(:method).and_return(true)
    end
  end

  describe "here I am using it" do
    include_context 'class stub'

    it 'Tests a Class Method' do
      expect { Class.method }.to eq true
    end
  end

  describe "here I am not" do
    it 'Tests a Class Method' do
      expect { Class.method }.not_to eq true
    end
  end
end

共享上下文可以包含let,帮助函数&amp;你需要的一切,除了例子。 https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-context