Явно проверить, определены ли библиотеки / гемы заглушкой в ​​rspec? - PullRequest
1 голос
/ 28 января 2011

Я создаю очень маленький гем, чтобы прочитать формат данных изображения и вернуть изображение в виде скучного рубинового массива или хорошего narray , в зависимости от того, a) был ли запрошен массив и б) если драгоценный камень доступен и необходим. Мой замысел заключается в том, что если кто-то хочет использовать narray, он может, но он должен явно потребовать это заранее. При чтении данных изображения я проверяю, определено ли значение narray (было необходимо), и просто добавляет предупреждение в переменную экземпляра msg для последующей печати / регистрации.

Я хотел бы включить тест для этого (я использую rspec2 и mocha для насмешек), но я немного новичок в фактическом использовании rspec. Я хотел бы сделать что-то вроде:

it "should return an narray if requested" do
  obj = NRead.new(@string, :bin => true, :narray => true)
  obj.image_narray.should_not be_nil
end

it "should add an NArray Install message and not set the image_narray if NArray was not available" do
  Object.stubs(:defined?).with(:NArray).returns(:false)
  obj = NRead.new(@string, :bin => true, :narray => true)
  obj.msg.should_not be_empty
  obj.msg.grep(/Please gem install narray/).empty.should be_false
  obj.image_narray.should be_nil
  obj.image_ruby_array.size.should == @fixture_image_length
end

... но я, должно быть, упускаю смысл использовать заглушки, потому что эта заглушка не меняет поведение определенных ?. Независимо от заглушки, определены? возвращает "реальное" значение (т. е. если я раскомментирую требование в коде, определено? ложно и мое предупреждение успешно добавлено).

Это даже не стоит тестировать? Есть лучший способ сделать это? Любые мысли будут оценены. Спасибо,

1 Ответ

2 голосов
/ 28 января 2011

определено?не является методом объекта.Вот почему ваша заглушка не работает.Это рубиновый оператор.Я не уверен, как заглушить оператора.Это определенно стоит проверить, так как это важно для функционирования вашего кода.

Чтобы проверить это, вы можете извлечь массив из $ "в ruby, который содержит информацию о kernel.load и вызвать до блока:

Object.send(:remove_const, :NArray)

Затем после блока вы можете запроситьЭто немного хакерски, возможно, есть лучший способ.

...