Прежде всего, я новичок в Ruby, хотя у меня сильный опыт в Java (здесь я не помогаю :). Я создал свое первое приложение на Rails и использую FactoryGirl. Я наткнулся на что-то странное (для меня) и не могу понять, почему оно так себя ведет.
Использование sprintf на заводе (см. Последний тест) вызывает следующую ошибку:
Failures:
1) Test raises an ArgumentError
Failure/Error: sprintf('Product %05d', n)
ArgumentError:
wrong number of arguments (3 for 2)
# ./spec/models/fg_spec.rb:6:in `fff'
# ./spec/models/fg_spec.rb:31:in `block (3 levels) in <top (required)>'
# ./spec/models/fg_spec.rb:62:in `block (2 levels) in <top (required)>'
Вот полная спецификация, демонстрирующая это поведение:
def fff(n)
sprintf('WWW Product %05d', n)
end
b1 = proc { |n| fff(n) }
b2 = proc { |n| sprintf('WWW Product %05d', n) }
FactoryGirl.define do
factory :product1, :class => Product do
sequence(:name) { |n| 'Product %05d' % "#{n}" }
end
factory :product2, :class => Product do
sequence(:name) { |n| sprintf('WWW Product %05d', n) }
end
factory :product3, :class => Product do
sequence(:name, 1, &b1)
end
factory :product4, :class => Product do
sequence(:name, 1, &b2)
end
factory :product5, :class => Product do
sequence(:name) { |n| fff(n) }
end
end
describe Test do
it "works with %" do
p = Factory.create(:product1)
puts p.inspect
end
it "does not work with sprintf" do
expect { Factory.create(:product2) }.to raise_error(ArgumentError)
end
it "works with a block with a function" do
p = Factory.create(:product3)
puts p.inspect
end
it "works with a block with sprintf" do
p = Factory.create(:product4)
puts p.inspect
end
it "does not work with a function with sprintf" do
expect { Factory.create(:product5) }.to raise_error(ArgumentError)
end
end
Конечно, я мог бы использовать запись%, но мне действительно любопытно это.
Спасибо
David