Ruby on rails Mmodel规范有很多:通过;如何让它工作?
我的活动和客户之间有一种叫做“活动客户”的关系(原创,嗯?) 每当我试图通过FactoryGirl规范我的Activity.rb时,我都会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
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
同样适用于:activityactivity\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)