我正在尝试测试覆盖Devise控制器的create方法,以确保在我的注册表单提交时,我的用户在数据库中创建并且地址关联。 实际上使用表单提交数据工作正常。
现在,当我开始测试时,我得到了:
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
RegistrationsController:
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关系。 我对rails测试世界很陌生,所以它可能很简单,但我已经花了很多时间试图弄清楚发生了什么。
感谢您的帮助