2014-02-19 8 views
0

Я работаю над некоторыми проверками rspec теперь, когда один из моих параметров инициализации является «чужим» классом, то есть я понятия не имею, откуда он. Он вводится из рамки, которую я использую. В моем коде мне нужно использовать этот объект для разных вещей, главным образом/исключительно для вызова методов для передачи данных на этот объект (без извлечения данных).RSpec издевается над всеми методами на объекте

Возможно ли полностью издеваться над объектом, чтобы я мог проверить, вызваны ли определенные неопределенные методы.

#an example of what this object could look like 
let(:my_obscure_object) { RSpec.complete_mock } #NOTE: This does not work 
... 
it "verify .whatever method is called" do 
    expect(my_obscure_object).to receive(:whatever).with(some_data) 
    my_class.work 
end 

it "verify .sub_whatever method is called" do 
    expect(my_obscure_object.sub_thing).to receive(:sub_whatever).with(some_data) 
    my_class.work2 
end 

Метод, который я могу думать о себе, чтобы решить это сделать объект и незавершенная каждый возможный метод, который я, возможно, потребуется, как этот

#an example of a tedious method to solve my problem 
let(:my_obscure_object) { Object.new } 
before(:each) do 
    my_obscure_object.stub(:whatever) { nil } 
    my_obscure_object.stub(:whatever2) { nil } 
    my_obscure_object.stub(:whatever3) { nil } 
    my_obscure_object.stub(:whatever4) { nil } 
    my_obscure_object.stub(:whatever5) { nil } 
    ob = Object.new 
    ob.stub(:sub_whatever) { nil } 
    my_obscure_object.stub(:sub_thing) { ob } 
end 
... 
it "verify .whatever method is called" do 
    expect(my_obscure_object).to receive(:whatever).with(some_data) 
    my_class.work 
end 
it "verify .sub_whatever method is called" do 
    expect(my_obscure_object.sub_thing).to receive(:sub_whatever).with(some_data) 
    my_class.work2 
end 

Есть ли решения моей проблемы?

ответ

2

Вы можете создать двойной тест, который будет принимать все вызовы методов, используя as_null_object следующим образом:

describe "SO example" do 
    #an example of what this object could look like 
    let(:my_obscure_object) { double("obscure").as_null_object } 
    let(:some_data) { 'foobar'} 

    it "verify .whatever method is called" do 
    expect(my_obscure_object).to receive(:whatever).with(some_data) 
    my_obscure_object.whatever(some_data) 
    end 

    it "verify .sub_whatever method is called" do 
    expect(my_obscure_object).to receive_message_chain(:whatever, :sub_whatever) 
    my_obscure_object.whatever.sub_whatever 
    end 

end 

Обратите внимание, что метод receive_message_chain доступен только по RSpec 3.0.0.beta2 доступен из GitHub и делает не позволяют указывать ожидаемые значения аргументов. Вы можете переписать это ожидание с использованием индивидуальных тестовых удвоений, если вы хотите использовать более старую версию RSpec или указать переданные аргументы.

+0

Будет ли «затенять» класс? Борясь, чтобы найти значение ввода строки для двойного метода. – Automatico

+0

№. Первый аргумент 'double' - это просто дескриптор, который можно использовать для целей отладки. Он игнорируется с точки зрения функциональности RSpec. –

+0

Просто нашел его в документе. Строка - это всего лишь идентификатор. [См. Doc] (https://relishapp.com/rspec/rspec-mocks/docs) – Automatico

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