ruby-on-rails - rspec 验证失败 : 'can' t be blank'

标签 ruby-on-rails rspec

我无法解决以下 rspec 验证错误:

Failures:

  1) User treating associations should have the right treatings in the right order
     Failure/Error: FactoryGirl.create(:treating, requestor: @user, created_at: 1.day.ago)
     ActiveRecord::RecordInvalid:
       Validation failed: Requestee can't be blank
     # ./spec/models/user_spec.rb:143:in `block (3 levels) in <top (required)>'

我正在处理两个模型,用户和处理(将其视为一次 session ):

用户.rb

class User < ActiveRecord::Base
    attr_accessible :name, :email, :password, :password_confirmation
    has_secure_password

    has_many :sent_treatings, :foreign_key => "requestor_id", :class_name => "Treating", dependent: :destroy
    has_many :received_treatings, :foreign_key => "requestee_id", :class_name => "Treating", dependent: :destroy

end

治疗.rb

class Treating < ActiveRecord::Base
  attr_accessible :intro, :proposed_date, :proposed_location

  validates :intro, presence: true, length: { maximum: 190 }
  validates :requestor_id, presence: true
  validates :requestee_id, presence: true

    belongs_to :requestor, class_name: "User"
    belongs_to :requestee, class_name: "User"

    default_scope order: 'treatings.created_at DESC'

end

最后,我的 user_spec 中给我这个错误的部分:

describe "treating associations" do
        before { @user.save }
        let!(:older_treating) do
            FactoryGirl.create(:treating, requestor: @user, created_at: 1.day.ago)
            FactoryGirl.create(:treating, requestee: @user, created_at: 1.day.ago)

        9end
        let!(:newer_treating) do
            FactoryGirl.create(:treating, requestor: @user, created_at: 1.hour.ago)
            FactoryGirl.create(:treating, requestee: @user, created_at: 1.hour.ago)
        end

        it "should have the right treatings in the right order" do
            @sent_treating = requestor.sent_treatings.build(intro: "Lorem ipsum")
            @sent_treating.requestee = requestee

            @received_treating = requestee.received_treatings.build(intro: "Lorem ipsum")
        @received_treating.requestor = requestor

            requestor.sent_treatings.should == [newer_treating, older_treating]
            requestee.received_treatings.should == [newer_treating, older_treating]
        end

我不确定为什么“被请求者”在这里为空,并且需要一些帮助。谢谢。

编辑:工厂在下面,谢谢!

FactoryGirl.define do
    factory :user do
        sequence(:name) { |n| "Person #{n}" }
        sequence(:email) { |n| "person_#{n}@example.com"}
        password "foobar"
        password_confirmation "foobar"

        factory :admin do
            admin true
        end
    end

    factory :treating do
    intro "Lorem ipsum"
  end

end

(我尝试在 :treating 工厂的 'intro' 下面添加 'user'、'requestor' 和 'requestee',但仍然没有成功)。当我在工厂文件中添加“用户”(位于“介绍“Lorem ipsum”下方)时,出现以下错误:

1) User treating associations should have the right treatings in the right order
     Failure/Error: FactoryGirl.create(:treating, requestor: @user, created_at: 1.day.ago)
     NoMethodError:
       undefined method `user=' for #<Treating:0x00000104fa0668>
     # ./spec/models/user_spec.rb:143:in `block (3 levels) in <top (required)>'

当我将“请求者”和“请求者”而不是用户添加到工厂(并且除了使用之外)时,我收到以下错误:

Failures:

  1) User treating associations should have the right treatings in the right order
     Failure/Error: FactoryGirl.create(:treating, requestor: @user, created_at: 1.day.ago)
     ArgumentError:
       Trait not registered: requestee

最佳答案

问题是您的Treating Factory没有定义请求者和被请求者,此外,您需要告诉FactoryGirl请求者和被请求者是用户的别名

factory :user, :aliases => [:requestor, :requestee]  do
    sequence(:name) { |n| "Person #{n}" }
    sequence(:email) { |n| "person_#{n}@example.com"}
    password "foobar"
    password_confirmation "foobar"

    factory :admin do
        admin true
    end
end

factory :treating do
    intro "Lorem ipsum"
    requestor
    requestee
end

关于ruby-on-rails - rspec 验证失败 : 'can' t be blank',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11764732/

相关文章:

ruby-on-rails - 这段 Ruby 代码是什么意思?

ruby-on-rails - ActiveRecord::RecordNotFound - 无法找到 id=new 的联系人

ruby - 我如何获得 rspec 的整个错误回溯?

ruby-on-rails - 在使用Capybara时调整Chrome窗口的大小

ruby-on-rails - 为什么从 github 获取的 gem 不存储在供应商/缓存中?

ruby-on-rails - 阵列::包括?在 ActiveRecord 集合上不调用 op==?

mysql - 从数据库中获取特定数据

ruby-on-rails - 使用 RSpec 测试模型中记录的正确顺序

ruby-on-rails - RSpec 删除 Date.today 以测试方法

ruby - 在 Ruby 1.9.3 中通过 RSpec 配置包含命名空间模块