我有一个包含列表的响应对象的工厂,所以我也有一个工厂用于该列表,但我现在每次进行build_list调用时都尝试获取动态列表。
世界现状如下:
API调用和响应看起来像这样。
pry(main)> get_customer('12345').class
=> Com::ListResult
pry(main)> get_customer('12345').c_list.class
=> Array
pry(main)> get_customer('12345').c_list[0].class
=> Com::Customer`
通话输出:
pry(main)> get_customer('12345')
=> #<Com::ListResult:0xHEX
@c_list=
[#<Com::Customer:0xHEX
@account_id="12345",
@email="test@bla.com">]>
我创建了一个工厂,如果我想只调用一次get_customer
,它就能正常工作。
这里是如何设置工厂的:
factory :customer_each, class: Com::Customer do
account_id "12345"
email "test@bla.com"
end
factory :customer_list_result, class: Com::ListResult do
customer_list FactoryGirl.build_list(:customer_each, 1)
end
在rspec中,我在下面给我模拟结果。
allow(subject).to receive(:get_customer).and_return(build(:customer_list_result))
现在我每次进行模拟调用时都会尝试获取不同的列表。我尝试了如下所示的序列,期望account_id为11111,22222,依此类推,但我总是得到11111。电子邮件并不重要,因为我只想要一个变量account_id。
factory :customer_bulk, class: Com::Customer do
sequence(:account_id) {|n| "#{n}"*5}
email "test@bla.com"
end
factory :customer_list_result, class: Com::ListResult do
customer_list FactoryGirl.build_list(:customer_bulk, 1)
end
答案 0 :(得分:0)
对于相同测试中的每个工厂方法调用,序列将使值增加1。如果您拨打一次,它只会返回第一个序列号,在这种情况下为1
。
每次打电话给工厂时,只要将一个随机数传递给account_id
就足够了吗?
factory :customer_bulk, class: Com::Customer do
# random 5-digit string
account_id { rand(1e4...1e5).to_i.to_s }
# or random string with same digit
account_id { "#{rand(10).to_s}" * 5 }
end
答案 1 :(得分:0)
好的,只需更改rspec即可返回一个块。
allow(subject).to receive(:get_customer) { (build(:customer_bulk)) }