2017-01-24 3 views
1

Можно ли сделать что-то вроде этого?RSpec перед в помощнике

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 

EDIT: Это производит следующее сообщение об ошибке:

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

По существу у меня есть случай, когда многие тесты делают разные вещи, но общая модель от них реагирует на после _commit, который в конечном итоге вызывает метод, который говорит с API. Я не хочу, чтобы GLOBALY разрешало Class получать :method, так как иногда мне нужно определить его для особых случаев ... но я бы не хотел повторять мой allow/receive/and_return и вместо этого обернуть его в общий помощник ...

ответ

3

Вы можете создать 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 блоков.

+0

!:) –

+0

Это гвоздь! Спасибо @Stefan :) – Nick

1

это можно делать такие вещи, как вы хотите с функцией под названием shared_context

вы можете создать общий файл с кодом, как этот

shared_file.rb

shared_context "stubbing :method on Class" do 
    before { allow(Class).to receive(:method).and_return(true) } 
end 

Тогда вы могли бы включить этот контекст в файлах, которые вы необходимы в блоках вы хотели, как так

your_spec_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 

И это будет более естественно для RSpec, чем ваш включен/расширенный модуль хелперы. Это будет «RSpec way», скажем так.

+0

Доступно ли это только в rspec 3.6+? – Nick

+0

Я думаю, что я на старой версии rspec; Я получаю эту ошибку: 'undefined method' shared_context_metadata_behavior = 'для # (NoMethodError)' - Кроме этого, это, вероятно, правильный aswer для последнего rspec ... – Nick

+1

Не уверен об этом. Я считаю, что использовал его в rspec 3.0. В любом случае, вы можете перейти по ссылке в моем ответе, выберите свою версию rspec и выясните, поддерживается ли эта функция вашей версией – VAD

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, вспомогательные функции & все, что нужно, за исключением примеров. https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-context

Смежные вопросы