Добавление теста rspec для модуля библиотеки, похоже, не подхватывает ожидания и совпадения - PullRequest
10 голосов
/ 12 июня 2009

Я добавляю больше тестов rspec в свое приложение и хотел бы протестировать модуль ScoringMethods, который находится в /lib/scoring_methods.rb. Поэтому я добавил каталог / spec / lib и добавил туда scoring_methods_spec.rb. Я потребовал spec_helper и настроил блок описаний так:

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe ScoringMethods do

  describe "should have scorePublicContest method" do
    methods = ScoringMethods.instance_methods
    methods[0].should match(/scorePublicContest/)
  end
end

Теперь methods[0] - это строка, и нет проблем с сопоставлением имени открытого метода с регулярным выражением. И относительный путь к «spec_helper» правильный.

Проблема в том, что вся установка не использует библиотеку rspec. Выполнение примера дает:

  ./spec/lib/scoring_methods_spec.rb:7: undefined method `match' for Spec::Rails::Example::RailsExampleGroup::Subclass_1::Subclass_1:Class (NoMethodError)
     ...

Кажется, отсутствует полная поддержка Expectation и Matcher. Чтобы проверить мое предположение, я изменил рабочую спецификацию помощника, заменив «is_instance_of» на «is_foobar_of». Этот тест просто проваливается и говорит, что is_foobar_of не является методом целевого объекта; что это, вся эта иерархия Spec :: Rails :: Example ... отсутствует.

Я пытался использовать и другие совпадения. Я пробовал "be_instance_of" и некоторые другие. Похоже, я неправильно включил библиотеку rspec.

Наконец, ScoringMethods - это модуль, точно так же, как помощники - это модули. Поэтому я подумал, что можно будет протестировать модуль (в отличие от классов, таких как контроллеры и модели).

Буду очень признателен за ваши мысли о том, что я сделал неправильно. Возможно, есть более эффективный способ тестирования библиотечных модулей? Спасибо!

1 Ответ

11 голосов
/ 12 июня 2009

Вы должны включить свой тестовый блок в блок "it". Например:

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe ScoringMethods do

  describe "should have scorePublicContest method" do
    it "should have a scorePublicContest method" do
      methods = ScoringMethods.instance_methods
      methods[0].should match(/scorePublicContest/)
    end
  end
end

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

Модель, которую мы часто используем при тестировании модулей, заключается в том, чтобы включить модуль либо в класс, созданный для теста (внутри файла спецификации), либо в состав самой спецификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...