rails rspec reflect_on_association错误

时间:2017-05-07 03:41:52

标签: ruby-on-rails ruby rspec

我正在关注this book并正在进行订单模型验证。

这是我的order_spec.rb

require 'spec_helper'

RSpec.describe Order, type: :model do
  let(:order) { FactoryGirl.build :order }
  subject { :order }

  it { should respond_to(:total) }
  it { should respond_to(:user_id) }

  it { should validate_presence_of :user_id }
  it { should validate_presence_of :total}
  it { should validate_numericality_of(:total).is_greater_than_or_equal_to(0) }

  it { should belong_to :user }


  it { should have_many(:placements) }
  it { should have_many(:products).through(:placements) }

end

我的工厂:

FactoryGirl.define do
  factory :order do
    user
    total "9.99"
  end
end

order.rb

class Order < ApplicationRecord
  belongs_to :user

  validates :total, presence: true,
                      numericality: { greater_than_or_equal_to: 0 }

  validates :user_id, presence: true

  has_many :placements
  has_many :products, through: :placements
end

placement.rb

class Placement < ApplicationRecord
  belongs_to :order, inverse_of: :placements
  belongs_to :product, inverse_of: :placements
end

用户模型user.rb

class User < ApplicationRecord

  validates :auth_token, uniqueness: true

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :recoverable,
    :rememberable, :trackable, :validatable

  before_create :generate_authentication_token!
  has_many :products, dependent: :destroy
  has_many :orders, dependent: :destroy

  def generate_authentication_token!
    begin
      self.auth_token = Devise.friendly_token
    end while self.class.exists?(auth_token: auth_token)
  end

  # validate :password_must_match
  # def password_must_match
  #   errors.add(:password, "doesn't match confirmation") if password != password_confirmation
  # end

end

现在我收到了这个错误:

  1) Order should have many placements
     Failure/Error: it { should have_many(:placements) }

     NoMethodError:
       undefined method `reflect_on_association' for Symbol:Class
     # ./spec/models/order_spec.rb:17:in `block (2 levels) in <top (required)>'

  2) Order should require total to be set
     Failure/Error: it { should validate_presence_of :total}

     NoMethodError:
       undefined method `total=' for :order:Symbol
     # ./spec/models/order_spec.rb:11:in `block (2 levels) in <top (required)>'

  3) Order should respond to #total
     Failure/Error: it { should respond_to(:total) }
       expected :order to respond to :total
     # ./spec/models/order_spec.rb:7:in `block (2 levels) in <top (required)>'

  4) Order should respond to #user_id
     Failure/Error: it { should respond_to(:user_id) }
       expected :order to respond to :user_id
     # ./spec/models/order_spec.rb:8:in `block (2 levels) in <top (required)>'

  5) Order should only allow numbers for total which are greater than or equal to 0
     Failure/Error: it { should validate_numericality_of(:total).is_greater_than_or_equal_to(0) }

     NoMethodError:
       undefined method `total=' for :order:Symbol
     # ./spec/models/order_spec.rb:12:in `block (2 levels) in <top (required)>'

  6) Order should require user_id to be set
     Failure/Error: it { should validate_presence_of :user_id }

     NoMethodError:
       undefined method `user_id=' for :order:Symbol
     # ./spec/models/order_spec.rb:10:in `block (2 levels) in <top (required)>'

  7) Order should belong to user
     Failure/Error: it { should belong_to :user }

     NoMethodError:
       undefined method `reflect_on_association' for Symbol:Class
     # ./spec/models/order_spec.rb:14:in `block (2 levels) in <top (required)>'

  8) Order should have many products through placements
     Failure/Error: it { should have_many(:products).through(:placements) }

     NoMethodError:
       undefined method `reflect_on_association' for Symbol:Class
     # ./spec/models/order_spec.rb:18:in `block (2 levels) in <top (required)>'

我调查了this question(可能重复),但它并没有解决我的问题。

1 个答案:

答案 0 :(得分:1)

您的subject是一个符号subject { :order }。我想你的意思是subject { order }