2015-04-20 3 views
2

Для Rails по умолчанию вы можете добавить так называемый ActiveModel::Lint::Tests, чтобы узнать, соответствуют ли ваши модели частям ActiveModel.Как использовать ActiveModel :: Lint :: Тесты в Rspec

Я бы назвал это или его эквивалент в своих тестах Rspec.

  • Я не хочу проверять точное поведение: тесты на линт указывают только на наличие определенного интерфейса. Я хочу только указать, что интерфейс существует.
  • Я скорее не test too close implementation. Простое тестирование того, что модуль включен, на самом деле не то же самое, что тестирование интерфейса существует.

Есть ли трюк для запуска и включить ядро ​​Rails ActiveModel::Lint::Tests в примерах rspec? Существуют ли альтернативы, специально построенные для Rspec, которые проводят такие тесты?

Некоторые фон:

Я строю модели, которые не наследуются от Activerecord::Base, но вместо того, чтобы действовать в качестве фабрик или государственных машин. В Rails также известны как служебные объекты. Они должны восприниматься как ActiveModels для пользователя. Такие вещи, как

@services << CompositeService.new(name: 'foo', children: [{ name: 'bar' }]) 
render @services 

должно быть возможным. Таким образом, такой CompositeService должен иметь именование activemodel, частичные пути, кеширование-идентификаторы и т. Д.

ответ

0

Я пишу драгоценный камень, который обеспечивает ActiveModel-совместимые модели и использует RSpec 3.x.

Чтобы получить тесты на линт, я добавил activemodel в качестве зависимости развития. Это также приводит к ActiveSupport и вместе с ним Minitest. Я решил, что могу использовать что-то вроде this gist, как и в прошлом, но столкнулся с issue, пытаясь получить тесты для использования Minitest's assert.

Я закончил тем, что бросил это вместе (кредит автора GIST), и положить его в spec/support:

require 'active_model/lint' 
require 'minitest' 

RSpec.shared_examples_for ActiveModel do 
    include ActiveModel::Lint::Tests 
    include Minitest::Assertions 

    alias_method :model, :subject 

    attr_accessor :assertions 

    before(:each) { self.assertions = 0 } 

    ActiveModel::Lint::Tests.public_instance_methods.map(&:to_s).grep(/^test/).each do |m| 
    it(m.sub 'test_', 'responds to ') { send m } 
    end 
end 

Это, кажется, работает до сих пор, я получаю сообщение об ошибке, как это:

Failure/Error: it(m.sub 'test_', 'responds to ') { send m } 
Minitest::Assertion: 
The model should respond to to_key 

Это не идеально, но со мной все в порядке. Тесты на линт настолько просты: , что было бы довольно тривиально реализовать общий пример с нуля (см. the source), но таким образом я могу просто положиться на драгоценный камень, чтобы держать тесты в актуальном состоянии.

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