Вложенный маршрут Capybara + Rspec

Возникли некоторые трудности с тестированием Capybara RSPEC, где у меня есть вложенный ресурс. Вот ошибка, которую я получаю:

1) Страницы с фотографиями посетить фото путь Фото можно посетить после того, как FactoryGirl создаст записи ←[31mFailure/Error: ←[0m ←[31mvisit mountain_photo_path(гора, фото) ←[0m

 ←[31mActiveRecord::RecordNotFound:←[0m
   ←[31mCouldn't find Photo with id=1 [WHERE "photos"."mountain_id" = 1]←[0m

←[36m # C:in find'←[0m ←[36m # ./app/controllers/photos_controller.rb:14:inshow' ←[0m ←[36m # ./spec/requests/photo_pages_spec.rb:34:in `блок (3 уровня) в ' ←[0m

Мой вложенный маршрут выглядит следующим образом:

  resources :mountains do
    resources :photos
  end

И я тестирую следующее в своем тесте RSPEC:

require 'spec_helper'

describe "Photo pages" do
    let(:user) { FactoryGirl.create(:user)}
    let(:region) { FactoryGirl.create(:region)}
    let(:mountain) {FactoryGirl.create(:mountain)}
    let(:photo) {FactoryGirl.create(:photo)}

    before { sign_in user }

    describe "visit mountain path" do
        it "can be visited after FactoryGirl create" do
            visit mountain_path(mountain)
            page.should have_selector('h1', text: "Breck Test")
        end
    it "has the correct region associated to it" do
        visit mountain_path(mountain)
        page.should have_selector('h4', text: "Rockies")
    end
    end


    describe "visit photo path" do
        it "Photo can be visited after FactoryGirl create records" do
            visit mountain_photo_path(mountain, photo) 
            page.should have_selector('title', text: photo.name)
        end
    end

end

Я считаю, что FactoryGirl успешно создает все записи. Вложение на фото выполняется через CarrierWave, и после отладки убедитесь, что оно также загружается правильно.

include ActionDispatch::TestProcess

FactoryGirl.define do
  factory :user do
    first_name 'Test'
    last_name 'User'
    email '[email protected]'
    password 'password1'
    password_confirmation 'password1'
    # required if the Devise Confirmable module is used
    confirmed_at Time.now
  end
  factory :region do
    name 'Rockies'
  end
  factory :mountain do
    name 'Breck Test'
    region {|a| a.association(:region)}
    description 'This is my testing mountain only'
  end
  factory :photo do 
    name 'My Photo Test'
    description 'My lovely description'
    mountain {|a| a.association(:mountain)}
    image { fixture_file_upload(Rails.root + 'spec/fixtures/files/breck.jpg', "image/jpeg")}
  end
end

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


person Mitch Nick    schedule 04.04.2013    source источник


Ответы (1)


Ваша проблема в том, что вы создаете mountain, затем photo, но они не связаны!

Сделайте это вместо этого:

require 'spec_helper'

describe "Photo pages" do
  let(:user) { FactoryGirl.create(:user)}
  let(:region) { FactoryGirl.create(:region)}
  let(:mountain) { FactoryGirl.create(:mountain)}
  let(:photo)    { FactoryGirl.create(:photo, mountain: mountain) }

  before { sign_in user }

  describe "visit photo path" do
    it "Photo can be visited after FactoryGirl create records" do
      visit mountain_photo_path(photo.mountain, photo) 
      page.should have_selector('title', text: photo.name)
    end
  end
end
person apneadiving    schedule 04.04.2013
comment
Спасибо за Ваш ответ. Я попробовал приведенный выше код, но он не работает, похоже, он не создает фотографию в настройках FactoryGirl. Текущий файл FactoryGirl, который, как я думал, свяжет эти две записи, он успешно делает это между регионом и горой, что было успешно протестировано с кодом, который я добавил к приведенному выше описанию. - person Mitch Nick; 04.04.2013