RSpec и ActiveRecord: примеры ошибок при проверке связи «один ко многим» - PullRequest
1 голос
/ 17 марта 2012

Я разрабатывал пример приложения после прочтения учебника по Rails 3.В этом приложении есть много разделов, и у каждого раздела есть одно видео.

Вот артефакты этого приложения:

Модели

class Video < ActiveRecord::Base
  has_many :sections
end

class Section < ActiveRecord::Base
  belongs_to :video

  validates :name, presence: true, length: { maximum: 50 }
end

RSpec

require 'spec_helper'

describe Section do

    let(:video) { Video.new(name: "Dummy Video Name", path: "/home/data/video/test.mov") }

  before do
    @section = video.sections.build(name: 'Test Section')
  end

    subject { @section }

    # Check for attribute accessor methods
    it { should respond_to(:name) }

    it { should respond_to(:video) }
    it { should respond_to(:video_id) }

    its(:video) { should == video }

    # Sanity check, verifying that the @section object is initially valid
    it { should be_valid }

    describe "when name is not present" do
        before { @section.name = "" }
        it { should_not be_valid }
    end

    describe "when name is too long" do
      before { @section.name = "a" * 52 }
      it { should_not be_valid }
    end

    describe "when video_id not present" do
        before { @section.video_id = nil }
            it { should_not be_valid }
    end
...
end

И определения схемы обеих Моделей

..
create_table "sections", :force => true do |t|
    t.string   "name"

    t.integer  "video_id"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

create_table "videos", :force => true do |t|
    t.string   "name"
    t.string   "path"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end
...

При выполнении выше rspec я получаю следующую ошибку.

Failures:

  1) Section 
     Failure/Error: it { should be_valid }
       expected valid? to return true, got false
     # ./spec/models/section_spec.rb:22:in `block (2 levels) in <top (required)>'

  2) Section video 
     Failure/Error: its(:video) { should == video }
       expected: #<Video id: nil, name: "Dummy Video Name", path: "/home/data/video/test.mov", created_at: nil, updated_at: nil>
            got: nil (using ==)
     # ./spec/models/section_spec.rb:19:in `block (2 levels) in <top (required)>'

Я мог бы сопоставить свое требование с отношением User-Micropost, описанным в книге, и согласовать RSpec с ними.У меня ограниченные знания по Rails и всей системе эхо.

Пожалуйста, помогите мне решить эту проблему, и некоторые ссылки на валидацию Модели с RSpec (и должны) очень заметны.

  • Amit Patel

1 Ответ

0 голосов
/ 18 марта 2012

Я могу решить эту проблему, сохранив видео в блоке before.

Вот фрагмент кода

before do
  video.save
  @section = video.sections.build(name: 'Test Section')
end

Единственное различие между спецификацией модели Micropost в Rails 3 Tutorialкнига и выше, первый использует FactoryGirl # create.Начиная с https://github.com/thoughtbot/factory_girl/wiki/How-factory_girl-interacts-with-ActiveRecord я обнаружил, что метод FactoryGirl.create фактически создает и сохраняет экземпляр внутри.Так что он работал там, пока он не работал в моем коде.

Если у вас есть лучшее понимание RSpec для ActiveRecord, пожалуйста, поделитесь с нами.

Спасибо.

AmitPatel

...