2015-04-20 3 views
0

У меня есть модель, которая описывает пациент (а Packet), который ссылается больница назначения и переносящая скорая помощь:код работает в консоли, но не с RSpec

class Packet < ActiveRecord::Base 
belongs_to :hospital 
belongs_to :provider 
validates_presence_of :hospital_id 
validates_presence_of :provider_id 
end 

class Hospital < ActiveRecord::Base 
has_many :packets 
end 

class Provider < ActiveRecord::Base 
has_many :packets 
end 

и мой спецификации RSpec:

require "rails_helper" 

RSpec.describe Packet, :type => :model do 
    it "creates a new packet" do 
    hospital = Hospital.create(:name=>"Community Hospital") 
    provider = Provider.create(:name=>"Community Ambulance", :unit=>"Ambulance 3") 

    packet = Packet.new() 
    packet.hospital = hospital 
    packet.provider = provider 
    packet.save 
    end 
    end 

RSpec терпит неудачу с: 1) пакет создает новый пакет Failure/ошибка: packet.hospital = Больница ActiveModel :: MissingAttributeError: не может писать неизвестную ATT ribute hospital_id

То, что я не понимаю, это то, что мясо моего теста (все в блоке «это») отлично работает в консоли рельсов без ошибок. Почему я должен получить неизвестный атрибут в тесте rspec, но не в консоли?

Полный трассировки стека: Garys-MacBook-Air-2: EMSPacket Гэри $ RSpec F

Failures: 

1) Packet creates a new packet 
    Failure/Error: packet.hospital = hospital 
    ActiveModel::MissingAttributeError: 
    can't write unknown attribute `hospital_id` 
# /Users/gary/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-4.2.0/lib/active_record/attribute.rb:124:in `with_value_from_database' 
# /Users/gary/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-4.2.0/lib/active_record/attribute_set.rb:39:in `write_from_user' 
# /Users/gary/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-4.2.0/lib/active_record/attribute_methods/write.rb:74:in `write_attribute_with_type_cast' 
# /Users/gary/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-4.2.0/lib/active_record/attribute_methods/write.rb:56:in `write_attribute' 
# /Users/gary/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-4.2.0/lib/active_record/attribute_methods/dirty.rb:92:in `write_attribute' 
# /Users/gary/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-4.2.0/lib/active_record/attribute_methods.rb:373:in `[]=' 
# /Users/gary/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-4.2.0/lib/active_record/associations/belongs_to_association.rb:80:in `replace_keys' 
# /Users/gary/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-4.2.0/lib/active_record/associations/belongs_to_association.rb:14:in `replace' 
# /Users/gary/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-4.2.0/lib/active_record/associations/singular_association.rb:17:in `writer' 
# /Users/gary/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-4.2.0/lib/active_record/associations/builder/association.rb:123:in `hospital=' 
# ./spec/models/packet_spec.rb:9:in `block (2 levels) in <top (required)>' 

Finished in 0.14495 seconds (files took 7.49 seconds to load) 

1 пример, 1 отказ

Failed examples: 

rspec ./spec/models/packet_spec.rb:4 # Packet creates a new packet 
+0

Вставить полный стек ошибок. – tebayoso

+0

Попробуйте запустить тот же код в консоли, но с тестовой средой: «RAILS_ENV = test rails console». Если это не удается, вы не перенесите свою базу данных. «rake db: test: подготовить» – tebayoso

+0

Хорхе, спасибо. Это был тест db – simusid

ответ

1

RSpec пытается проверить everystep внутри он блокируется, поэтому тест терпит неудачу, но консоль работает. Перед тестированием вы должны создать запись с атрибутами и отношениями, а затем проверить что-то.

Код, который вы вставили для идентификатора тестов, фактически не тестировал ничего.

Попробуйте проверить те вещи, которые могут действительно потерпеть неудачу, например, сэкономить на ошибках или создать без ассоциаций. Но не повторять шаги внутри теста.

describe "When creating new package" do 
    let(:hospital) {Hospital.create(attributes)} 
    let(:provider) {Provider.create(attributes)} 
    let(:packet) {Packet.create(hospital_id: hospital.id, provider_id: provider.id)} 

    it "should have the associations linked" do 
    expect(package.hospital_id).to eq(hospital.id) 
    expect(package.provider_id).to eq(provider.id) 
    end 
end 

EDITED:

Не забывайте запускать миграции в тестовой базе данных:

rake db:test:prepare 
+0

Но я создаю записи с атрибутами. Я использую Hospital.create() так же, как и вы. Я знаю, что мой код на самом деле ничего не тестирует. Я удалил весь код expect(). Я вставлял ваш код (с некоторыми незначительными исправлениями), и я все еще получаю «неизвестный атрибут« hospital_id »для Packet». – simusid

+0

Отредактировано с правильным ответом после консультации. – tebayoso

0

Мне нравится использовать https://github.com/thoughtbot/shoulda-matchers в моих тестах

было бы

describe 'associations' do 
    it { should belong_to :hospital } 
    it { should belong_to :provider } 
end 


describe 'validations' do 
    it { should validate_presence_of :hospital_id } 
    it { should validate_presence_of :provider_id } 
end 

В любом случае посмотрите на https://github.com/thoughtbot/factory_girl, это также поможет вам в тестах.

0

Кредит Хорхе де лос Сантос, проблема была в установке моей тестовой базы данных. Спасибо, Хорхе!

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