I have this model:
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
and this specs:
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 works; S2 and S3 don't work:
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
But, the two examples work with console and http. Specs based on helpers predefined validators work all.
How can I fix these specs ?
Thanks
I changed samples S2 and S3 so:
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
Now it works.