我有这个型号:
class Proceeding < ActiveRecord::Base
attr_accessible :archive_id, :assets, :kind
validates_presence_of :archive_id, :kind
validates_format_of :kind, :with => /^(deroga|progetto)$/
validate :assets_list_must_be_valid_or_empty
def assets_list
self.assets.split.map!{|a| a.upcase.strip}
end
private
def assets_list_must_be_valid_or_empty
if self.assets
al = self.assets_list
if Asset.find_all_by_name(al).size < al.size
errors.add(:assets, "list is not valid")
end
end
end
end
和这个规格:
require 'spec_helper'
describe Proceeding do
before :each do
@proceeding = Proceeding.new( archive_id: "test", kind: "progetto", assets: "")
end
it "is valid" do
expect(@proceeding).to be_valid #S1
end
it "single is valid" do
@proceeding.assets = " 1.1.c "
expect(@proceeding).to be_valid #S2
end
it "multiple is valid" do
@proceeding.assets = " 1.1.c 80.1.a 2.1.B 4.1.b "
expect(@proceeding).to be_valid #S3
end
end
S1工作; S2和S3不起作用:
Failures:
1) Proceeding asset multiple is valid
Failure/Error: expect(@proceeding).to be_valid
expected #<Proceeding id: nil, kind: "progetto", archive_id: "test", assets: "
1.1.c 80.1.a 2.1.B 4.1.b ", created_at: nil, updated_at: nil> to be valid, but
got errors: Assets list is not valid # ./spec/models/proceeding_spec.rb:62:in
`block (3 levels) in <top (required)>'
2) Proceeding asset single is valid
Failure/Error: expect(@proceeding).to be_valid
expected #<Proceeding id: nil, kind: "progetto", archive_id: "test", assets: "
1.1.c ", created_at: nil, updated_at: nil> to be valid, but got errors: Assets
list is not valid # ./spec/models/proceeding_spec.rb:57:in `block (3 levels) in
<top (required)>'
rspec ./spec/models/proceeding_spec.rb:60 # Proceeding asset multiple is valid
rspec ./spec/models/proceeding_spec.rb:55 # Proceeding asset single is valid
但是,这两个例子适用于console和http。 基于帮助程序预定义验证程序的规范可以工作。
如何修复这些规格?
由于
答案 0 :(得分:0)
我更改了样本S2和S3,所以:
it "single is valid" do
@proceeding.assets = " 1.1.c "
@proceeding.save
expect(@proceeding.assets_list.count).to eq(1) #S2
end
it "multiple is valid" do
@proceeding.assets = " 1.1.c 80.1.A 4.1.b "
@proceeding.save
expect(@proceeding.assets_list.count).to eq(3) #S3
end
现在可行。