我正在关注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(可能重复),但它并没有解决我的问题。
答案 0 :(得分:1)
您的subject
是一个符号subject { :order }
。我想你的意思是subject { order }