Ruby on rails Mmodel规范有很多:通过;如何让它工作?

Ruby on rails Mmodel规范有很多:通过;如何让它工作?,ruby-on-rails,rspec,ruby-on-rails-4,factory-bot,Ruby On Rails,Rspec,Ruby On Rails 4,Factory Bot,我的活动和客户之间有一种叫做“活动客户”的关系(原创,嗯?) 每当我试图通过FactoryGirl规范我的Activity.rb时,我都会 1) Activity has valid factory Failure/Error: expect(FactoryGirl.build(:activity)).to be_valid NoMethodError: undefined method `stringify_keys' for #<Activityclien

我的活动和客户之间有一种叫做“活动客户”的关系(原创,嗯?)

每当我试图通过FactoryGirl规范我的Activity.rb时,我都会

 1) Activity has valid factory
    Failure/Error: expect(FactoryGirl.build(:activity)).to be_valid
    NoMethodError:
      undefined method `stringify_keys' for #<Activityclient:0x73498b0>
    # ./app/models/activity.rb:52:in `block in activityclients='
    # ./app/models/activity.rb:48:in `each'
    # ./app/models/activity.rb:48:in `activityclients='
    # C:in `object'
    # ./spec/models/activity_spec.rb:5:in `block (2 levels) in <top (required)>
以及我的Activityclient工厂:

FactoryGirl.define do
    factory :activityclient do
        start_date {Date.parse('2013-05-13 12:00:00')}
        end_date {Date.parse('2013-05-13 12:15:00')}
        group_id { 1 }
    end
end
我做错了什么

提前感谢,

编辑:根据@Vee的建议编辑。尽管有相同的错误,但在
activity
activityclient
工厂中,某些“假定”属性被视为方法

使用以下内容更新
活动
工厂:

FactoryGirl.define do
    factory :activity do
        title { "Activity" }
        group_id { "1" }
        url { "http://www.abc.com/"} 
        activityclients {[FactoryGirl.create(:activityclient)]}
        client {FactoryGirl.create(:client)}
    end
end
请注意如何使用
{…}
设置
标题
组id
url
。同时确保
activityclient
工厂中的
group\u id
属性相同:

FactoryGirl.define do
    factory :activityclient do
        start_date {Date.parse('2013-05-13 12:00:00')}
        end_date {Date.parse('2013-05-13 12:15:00')}
        group_id { 1 }
    end
end
其他一些建议:

当您在factory girl工厂内时(更确切地说,当已经需要
factory\u girl
时),您不需要拼写
FactoryGirl.create
,您可以调用
create
。其次,不要执行
Date.parse
suppling timepart,因为您使用的是Date类,所以会忽略它。您应该使用
Time
DateTime

有了这些,您的工厂将如下所示(注意,下面的示例使用
DateTime
,如果愿意,您可以使用
Time
):

为确保关联设置正确,请更新出厂定义以用作:

而不是使用
a.activityclients{[create(:activityclient)]}
分配数组。对于前者,FactoryGirl分配并保存关联,而对于后者,虽然分配了数组,但不保存关联

更新:


只有在使用规范中的
FactoryGirl.create…
创建工厂时,才会执行(:create)之后的
回调。如果您仅使用
FactoryGirl.build
构建它们,则应将(:create)
之后的
替换为(:build)
之后的
。有关详细信息,请参阅

嗯,;仍然不起作用。每次我执行
FactoryGirl.build(:activity)
时,它都会在
Activityclient上给出stringify错误
Activityclient.rb已
归属于:activity
归属于:client
。Client.rb
有许多:ActivityClient
有许多:activities,通过::ActivityClient
同样适用于:activity
activity\u Client
提供的
工厂未注册:activity\u Client
@CaptainCarl,正确。由于您的类名是
Activityclient
(小写
c
),因此无需更改名称。我已经更新了我的答案,在(:create)
回调后使用
,请尝试一下。谢谢。不幸的是,它导致
上的nil:NilClass`的
未定义方法
[]无效。
FactoryGirl.define do
    factory :activityclient do
        start_date {Date.parse('2013-05-13 12:00:00')}
        end_date {Date.parse('2013-05-13 12:15:00')}
        group_id { 1 }
    end
end
# activity
FactoryGirl.define do
    factory :activity do
        title { "Activity" }
        group_id { 1 }
        url { "http://www.abc.com/"} 
        activityclients { [ create(:activityclient) ] }
        client { create(:client) }
    end
end

#activityclient
FactoryGirl.define do
    factory :activityclient do
        start_date { DateTime.now.midnight }
        end_date { DateTime.now.midnight.change(min: 15) }
        group_id { 1 }
    end
end
# activity
FactoryGirl.define do
    factory :activity do
        title { "Activity" }
        group_id { 1 }
        url { "http://www.abc.com/"} 

        after(:create) do |a|
          a.activityclients << create(:activityclient)
          a.client { create(:client) }
        end
    end
end
a.activityclients << create(:activityclient)