Учитывая, что у меня есть Personable
проблема с моим приложением Rails 4, у которого есть full_name
метод, как мне протестировать это с помощью RSpec?
проблемы / personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
ruby-on-rails
testing
rspec
Кайл Декот
источник
источник
ActiveSupport::Concern
убирали из Rails? Я думал, что это было недавно.Ответы:
Найденный вами метод, безусловно, сработает для проверки некоторой функциональности, но кажется довольно хрупким - ваш фиктивный класс (на самом деле только
Struct
в вашем решении) может или не может вести себя как настоящий класс, которыйinclude
вас беспокоит. Кроме того, если вы пытаетесь протестировать проблемы модели, вы не сможете делать такие вещи, как проверка достоверности объектов или вызывать обратные вызовы ActiveRecord, если вы не настроите базу данных соответствующим образом (потому что ваш фиктивный класс не будет иметь поддержку таблицы базы данных Это). Более того, вы захотите не только протестировать проблему, но и проверить ее поведение в спецификациях вашей модели.Так почему бы не убить двух зайцев одним выстрелом? Используя общие группы примеров RSpec , вы можете проверить свои опасения относительно реальных классов, которые их используют (например, моделей), и вы сможете тестировать их везде, где они используются. И вам нужно только один раз написать тесты, а затем просто включить их в любую спецификацию модели, которая использует вашу проблему. В вашем случае это может выглядеть примерно так:
Преимущества этого подхода становятся еще более очевидными, когда вы начинаете делать что-то интересное, например, вызывать обратные вызовы AR, где ничего, кроме объекта AR, просто не подойдет.
источник
parallel_tests
. Я думаю, что лучше будет иметь отдельные тесты вместо использованияshared_examples_for
иit_behaves_like
.parallel_tests
основаны на файле, поэтому общие примеры не должны замедлять его. Я бы также сказал, что правильно сгруппированные общие поведения важнее скорости тестирования.concerns
каталог в свойspec_helper.rb
github.com/rspec/rspec-core/issues/407#issuecomment-1409871_spec
к имени файла, которое содержит shared_examples_for (в данном случае personable_spec.rb), иначе вы получите вводящее в заблуждение предупреждающее сообщение - github.com/rspec/rspec-core/issues/828 .В ответ на полученные мной комментарии вот что я в итоге сделал (если у кого-то есть улучшения, не стесняйтесь публиковать их) :
спецификация / проблемы / personable_spec.rb
источник
Person
. Отредактирую, чтобы исправить.undefined method 'full_name' for #<struct first_name="Stewart", last_name="Home">
Еще одна мысль - использовать гем with_model для тестирования подобных вещей. Я сам искал, чтобы проверить проблему, и видел, как гем pg_search делал это . Это кажется намного лучше, чем тестирование на отдельных моделях, поскольку они могут измениться, и неплохо определить то, что вам понадобится, в вашей спецификации.
источник