2013-09-10 1 views
0

Я работаю над приложением для блога с использованием Ruby on Rails. У меня есть модель под названием «Эссе» с декоратором Дрейпера. Я также использую MiniTest :: Spec для тестирования этого приложения. В каждом эссе есть тело, которое будет храниться как Markdown. В EssayDecorator у меня есть метод, называемый телом, который отображает Markdown в html с помощью RedCarpet.Проверка вызова внешней библиотеки в MiniTest

Для того, чтобы проверить этот метод, я написал следующий код:

describe '#body' do 
    it 'returns html from the markdown' do 
    essay = FactoryGirl.create(:essay) 
    @decorated_essay = essay.decorate 
    markdown = Minitest::Mock.new 

    @decorated_essay.stub :markdown, markdown do 
     markdown.expect :render, "<p>Test</p>", [essay.body] 
     @decorated_essay.send(:body) 
     markdown.verify 
    end 
    end 
end 

И внутри декоратора У меня есть два метода:

def body 
    markdown.render(model.body).html_safe 
    end 

    def markdown 
    Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true) 
    end 

Этот тест проходит, но кажется странным для меня. Я не хочу проверять, что RedCarpet выполняет свою работу, я просто хочу проверить, что я вызываю метод render.

Есть ли лучшая практика для издевательства такого рода вещей в MiniTest? Я довольно новичок в использовании Mocks и очень новичок в использовании MiniTest.

Спасибо, заранее.

+0

Посмотрите на [rr] (https://github.com/rr/rr) для более гибкой тестовой двойной библиотеки (хорошо сочетаются с MiniTest), а также общее обсуждение того, как макеты, заглушки, шпионы , и прокси-серверы могут помочь вам протестировать ваш код. –

ответ

0

IMO этот код кажется странным, потому что он не тестирует поведение вашего кода, но он тестирует реализацию. Если реализация изменилась (вы сохранили HTML в кеше вместо того, чтобы запускать его через Redcarpet), то этот тест завершится неудачно. Это выглядит слишком насмешливым.

Я не хочу проверять, что RedCarpet выполняет свою работу, я просто хочу проверить, что вызываю метод визуализации.

Это реализация. Почему вы управляете телом через уценку? Потому что вы хотите создавать гиперссылки из URL-адресов? Я бы создал для этого тест. Вы хотите, чтобы ссылки имели атрибут no-follow? Я бы создал для этого тест. Создайте тесты для того, почему код что-то делает, а не как он это делает.

Возможно также, что в приложении отсутствует абстракция. Что-то, что отвечает за форматирование простого текста в HTML. То, что использует Redcarpet или RDiscount или любую другую библиотеку, считается важным. Возможно, EssayDecorator не несет ответственности за то, что текст был отформатирован правильно, но он может нести ответственность за указание правильному объекту применить форматирование.

+0

Создание теста для визуализации гиперссылок, похоже, похоже на то, что будет жить в приемочном тесте. Не тест для этого метода. Если я проверю это на декораторе, не будет ли приемочный тест дважды проверять эту функциональность? –

+0

Это относится к целям испытаний. В TDD они там, чтобы дать отзыв об API, который вы подвергаете. В этом случае модели вашего домена отображают API для вашего уровня представления. Тесты описывают функциональность, но не реализацию. Это важно, потому что вы хотите иметь возможность рефакторировать - изменить реализацию, не изменяя API, и ваши тесты все равно будут проходить. Когда вы указываете реализацию в тестах, вы создаете связь. Сцепление так же плохо в тестах, как и в остальном коде. Поэтому вопрос, который я оставил, - это то, почему вы вообще насмехаетесь? – blowmage

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