rspec factorygirl建立一个变量列表工厂

时间:2017-10-04 03:14:54

标签: ruby-on-rails ruby rspec factory-bot

我有一个包含列表的响应对象的工厂,所以我也有一个工厂用于该列表,但我现在每次进行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

2 个答案:

答案 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)) }