2016-12-15 3 views
0

Итак, у меня есть класс ruby, который импортирует и использует рубиновый камень. Сам камень протестирован сам по себе, но я хочу написать тест, который гарантирует, что метод класса вызовет правильный метод на драгоценном камне.тест метод метода класса ruby ​​метод в другом драгоценном камне

Я не уверен, как это будет работать.

Вот мой метод класса:

def article_body 
    renderer = ArticleBodyRenderer.new 
    renderer.to_html(data.fetch(:body)) 
    end 

Я хочу, чтобы мой тест, чтобы проверить, что этот метод вызывает: renderer.to_html()

Как бы я сделать это в рубин. Я использую rspec unit tests.

ответ

1

Для обеспечения того, чтобы renderer Инициализация в рамках метода заштрихована, вам необходимо использовать "Any instance of" stub. Итак:

let(:formatted_text) { '<foo>bar</foo>' } 

it 'calls the to_html on rendered' do 
    allow_any_instance_of(ArticleBodyRenderer).to receive(:to_html).and_return(formatted_text) 
    expect(subject.article_body).to eq(formatted_text) 
end 
+0

Спасибо, это заставляет пройти тест! – chinds

1

Должно быть что-то вдоль этих линий:

let(:renderer) { ArticleBodyRenderer.new } 

it 'calls the to_html on rendered' do 
    expect(renderer).to receive(:to_html) 
    subject.article_body 
end 

Логика заключается в следующем: сначала вы говорите, что вы ожидаете какой-то объект, чтобы получить какое-то сообщение (метод вызывается на этом объекте), и чем вы вызываете что-то , который должен фактически выполнять ожидаемый вызов метода на ожидаемом объекте.

+0

Дамба это действительно так просто? Я попробую это сейчас. Спасибо за комментарий. – chinds

+0

Могу ли я попросить эту строку для 'subject.article_body' – chinds

+0

@chinds, поэтому логика такова: сначала вы говорите, что вы ожидаете, что какой-то объект получит какое-то сообщение (метод, вызываемый на этом объекте), и чем вы запускаете что-то , который должен фактически выполнять ожидаемый вызов метода на ожидаемом объекте. –

1

Вы должны извлечь экземпляр renderer в свой собственный метод:

def renderer 
    @renderer ||= ArticleBodyRenderer.new 
end 

def article_body 
    renderer.to_html(data.fetch(:body)) 
end 

Это позволяет глумиться его более легко, например, с помощью instance double:

renderer_double = instance_double('ArticleBodyRenderer') 
allow(your_instance).to receive(:renderer).and_return(renderer_double) 

expect(renderer_double).to receive(:to_hml).with(...) 
your_instance.article_body 

или через spy:

renderer_spy = spy('ArticleBodyRenderer') 
allow(your_instance).to receive(:renderer).and_return(renderer_spy) 

your_instance.article_body 
expect(renderer_spy).to have_received(:to_hml).with(...) 
+0

Это потрясающе спасибо! Пример с использованием экземпляра_double отличен – chinds

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