是否可以做这样的事情?
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
,因为有时我需要自己定义特殊情况...但我不想重复我的允许/接收/并且返回而是将其包装在一个共同的帮手......
答案 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