gpt4 book ai didi

ruby - 跨不同工厂共享特征

转载 作者:数据小太阳 更新时间:2023-10-29 06:43:56 26 4
gpt4 key购买 nike

我有许多模型可以是可授权的(有一个作者字段)和/或可租赁的(有一个租户字段)。所以,我写了对他们两个的担忧。

问题出在测试中。我曾使用 shared_examples_for block 为关注点编写测试并将它们包含到我的模型测试中。无论如何,要做到这一点,我有几个特征和 block 后,例如:

after(:build) do |authorable|
authorable.author = build(:user, tenant: authorable.tenant)
end

trait :no_author do
after(:build) do |authorable|
authorable.author = nil
end
end

trait :no_tenant do
tenant nil
end

这段代码在所有可租赁和可授权模型的工厂中应该是平等的。

我没有找到任何方法来做到这一点。可能吗?

最佳答案

Traits 可以全局注册,这样它们就可以在任何其他工厂中使用,而无需使用 FactoryGirl 的继承:

FactoryGirl.define do
trait :no_author do
after(:build) { |authorable| authorable.author = nil }
end

trait :no_tenant do
tenant nil
end

factory :model do
tenant { build(:tenant) }
end
end

然后您可以像这样简单地构建您的对象:

FactoryGirl.build(:model, :no_tenant)
FactoryGirl.build(:model, :no_author)

after 回调也可以全局注册,但这意味着它们会被 FactoryGirl 创建的任何对象触发,这可能会导致不良副作用:

FactoryGirl.define do
after(:build) do |authorable|
authorable.author = build(:user, tenant: authorable.tenant)
end

factory :model do
tenant { build(:tenant) }
end

factory :other_model
end

FactoryGirl.build(:model) # Happiness!
FactoryGirl.build(:other_model) # undefined method `tenant'

为避免这种情况,您可以将回调包装在一个特征中,就像您在 :no_author 特征中所做的那样,或者您可以使用工厂继承:

FactoryGirl.define do
factory :tenancyable do
trait :no_tenant do
tenant nil
end

factory :authorable do
after(:build) do |authorable|
authorable.author = build(:user, tenant: authorable.tenant)
end

trait :no_author do
after(:build) do |authorable|
authorable.author = nil
end
end
end
end

factory :model, parent: :authorable, class: 'Model' do
tenant { build(:tenant) }
end

factory :other_model
end

请注意如何在此处显式指定model 工厂的类以使其工作。您现在可以构建对象:

FactoryGirl.build(:model, :no_author) # Happiness!
FactoryGirl.build(:other_model) # More Happiness!

使用第二种方法,特征和回调包含得更多。当您拥有包含许多工厂的大型代码库时,这实际上可能会减少不必要的意外。

关于ruby - 跨不同工厂共享特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com