Я пытаюсь протестировать метод создания переопределенного контроллера Devise, чтобы убедиться, что при отправке моей регистрационной формы мой пользователь создается в базе данных со связанным адресом.На самом деле использование формы для отправки данных работает нормально.
Теперь при запуске теста я получаю:
Failure/Error: post :create, :user => {
NameError:
uninitialized constant User::Address
Вот код для различных акторов:
Пользовательмодель
class User < ActiveRecord::Base
has_many :products, :as => :owner, :dependent => :destroy
has_one :address, :as => :addressable, :dependent => :destroy
has_and_belongs_to_many :shops
accepts_nested_attributes_for :address
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:token_authenticatable, :confirmable, :lockable, :timeoutable, :omniauthable
attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :address_attributes
end
Затем модель адреса
class Address < ActiveRecord::Base
belongs_to :addressable, :polymorphic => true
attr_accessible :address
end
Контроллер регистрации:
class RegistrationsController < Devise::RegistrationsController
def new
resource = build_resource({})
resource.build_address
respond_with resource
end
end
Я переопределяю новый метод для создания связанного адреса
И, наконец, тест:
require 'spec_helper'
describe RegistrationsController do
render_views
describe "the registration process" do
before do
@request.env["devise.mapping"] = Devise.mappings[:user]
end
it "creates a new user" do
lambda do
post :create, :user => {
:email => 'user@test.com',
:password => 'somepassword',
:password_confirmation => 'somepassword',
:address_attributes => {
:address => 'an address'
}
}
end.should change(User, :count).by(1)
end
end
end
То же самое происходит, если я пишу тест с использованием Capybara, заполняющим форму вместо размещения хеша.
Похоже, он не распознаетОтношения ActiveRecord в тестовой среде.Я довольно новичок в мире рельсового тестирования, так что это может быть что-то довольно простое, но я уже потратил много времени, пытаясь выяснить, что происходит.
Спасибо за помощь