使用具有一个相关地址模型的用户模型进行失败的RegistrationsController测试

时间:2012-01-13 17:07:25

标签: ruby-on-rails ruby-on-rails-3.1 devise rspec2

我正在尝试测试覆盖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测试世界很陌生,所以它可能很简单,但我已经花了很多时间试图弄清楚发生了什么。

感谢您的帮助

0 个答案:

没有答案