2012-06-14 3 views
2

Приложение: Sinatra + ActiveRecord
Попытка проверить существование ассоциации с использованием лучших практик.
мне очень нравится синтаксис Shoulda:Тестирование ассоциаций ActiveRecord с помощью приложения Shoulda in non-Rails

describe Bar do 
     it { should belong_to(:foo) } 
    end 

Однако RSpec не может найти метод belong_to.

1) ResOutcome 
     Failure/Error: it { should belong_to(:foo) } 
     NoMethodError: 
     undefined method `belong_to' for #<RSpec::Core::ExampleGroup::Nested_1:0x00000103ac6760> 
     # ./spec/models/bar_spec.rb:48:in `block (2 levels) in <top (required)>' 

Любые подсказки?
Тестирование связей Has Shoulda работает только в Rails-приложениях (с rspec-rails)?
Спасибо всем за ваше время.

ответ

0

Как упоминается в других ответах, это происходит из-за того, что shoulda-matchers включен до подключения к ActiveRecord, по крайней мере, на Sinatra.

В вашем Gemfile, не забудьте добавить require: false, например, так:

gem "shoulda-matchers", "~> 2.4.0", require: false 

Это предотвращает приложение из автоматически требует драгоценный камень, прежде чем что-либо еще было сделано.

Затем в spec/spec_helper.rb, первые требуют вашего приложения (где active_record предположительно включен и устанавливается соединение), а затем в файле вручную требуется shoulda-matchers.Например:

require File.dirname(__FILE__) + '/../the_app_itself' 
require 'shoulda-matchers' 

Теперь вы можете использовать matchers в ваших спецификациях как обычно:

describe LouieGeetoo do 
    it { should have_many(:video_games) } 
end 

Yay!

1

Вы добавили shoulda-matchers к вашему Gemfile? https://github.com/thoughtbot/shoulda-matchers


Update:

Добавить require 'shoulda/matchers в конфигурацию spec_helper.rb.

+0

да, но до сих пор нет радости ... – jgpawletko

+0

У меня есть другая идея, попробуйте 'require 'shoulda/matchers'' в' spec_helper.rb' – luacassus

0

У меня была аналогичная проблема, хотя я не использую RSpec. Тем не менее, использование Sinatra и ActiveRecord.

В моем случае мне нужно было изменить свои тестовые классы от наследования от ActiveSupport::TestCase до наследования с Test::Unit::TestCase.

В любом случае я не использовал функциональность ActiveSupport::TestCase, поэтому он работал нормально. Я понимаю, что это не ваш случай использования, но, возможно, он указывает вас в правильном направлении и помогает кому-то другому, кто использует Test::Unit.

0

У нас была аналогичная проблема. Они работают в приложении, отличном от Rails.

Наш вопрос оказался из-за того, что мы пытались потребовать «шасси-помощники», прежде чем мы действительно потребовали нашего приложения, а это означало, что камень искал ActiveRecord :: Base и не смог его найти.

Мы исправили проблему, потребовав сначала приложения, а затем потребовали «сокеты-помощники» после этого. Глупый.

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