【问题标题】:Factorygirl error using callback: Wrong Number of Arguments使用回调的 Factorygirl 错误:参数数量错误
【发布时间】:2013-06-16 17:02:45
【问题描述】:

您好,感谢您的阅读。这是我的工厂:

FactoryGirl.define do
  factory :venue do
    sequence(:name) { |n| "ExampleVenue#{n}" }

    factory :venue_with_gig do
      after_create do |venue|
        create(:gig, venue: venue)               #I've created a valid gig factory as well
      end                                        
    end
  end
end 

一个场地有_许多演出和演出属于_场地。我在这里的内容似乎遵循了思想机器人blog post here

上的示例

然而,我运行我的模型规格并由于以下错误 wrong Number of Arguments (3 for 2) at thebefore` 操作而失败:

需要'spec_helper'

describe Venue do
  describe "basic attributes" do
    before { @venue = create(:venue_with_gig) }

    subject { @venue }

    it { should be_valid }
    it { should respond_to(:name) }
    # it { should respond_to(:address) }
    it { should respond_to(:gigs) }
  end 

  describe "with invalid params" do
    before { @venue = build(:venue, name: " ") }
    subject { @venue }

    it { should_not be_valid }
  end
end

我看它太久了,可以使用新的视角。谢谢!

【问题讨论】:

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


    【解决方案1】:

    由于场地有可能的演出,有必要在说“venue_with_gig”时定义你需要的man gigs,一个更好的名字是“venue_with_gigs”。你还需要使用create_list

    # under venue define as your code
    factory :venue_with_gigs do
      ignore do
        gigs_count 3 # Let's say 3 gigs as default
      end
    
      after(:create) do |venue, evaluator|
        FactoryGirl.create_list(:gig, evaluator.gigs_count, venue: venue)
      end                                        
    end
    

    默认使用

    FactoryGirl.create(:venue_with_gigs)
    # => 1 venue and 3 gigs created. Gigs under the venue
    

    自定义数量

    FactoryGirl.create(:venue_with_gigs, gigs_count: 10)
    # => 1 venue 10 gigs created
    

    【讨论】:

    • 我需要对此进行更多研究。我刚刚有时间按原样运行代码,并为#<:declaration::implicit:0x007f90e7d6c700> 获得了undefined method gigs_count'。以后有时间我会研究 FactoryGirl 文档,看看这里是否有一些小错误,或者是否有遗漏。我会说,考虑到我上面链接的内容,这似乎有些过分,尽管我当然不排除您的建议会解决我的问题的可能性。谢谢!
    • @aceofbassgreg,我的荣幸!
    • 我删除了我的评论,因为我的编辑被拒绝了。我也未选中此作为答案,因为现在代码已损坏。最重要的是将evaluator 作为after(:create) 块中管道之间的参数传递。完成编辑后,我将继续并再次接受答案。
    • @aceofbassgreg,是的,应该是 after(:create) 而不是 after_create。在第一个版本中,我只是盲目地复制了您的代码:)
    • 另外,您还需要将evaluator 添加到after(:create) 块:-)。代码应为:after(:create) do |venue, evaluator|。对不起!由于我无法编辑,我唯一的其他选择是回答我自己的问题,这似乎不公平,因为你让我朝这个方向发展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2022-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多