我试图像这样在FactoryBot中定义一个lambda ...
contact_methods = %w[Phone Email Snail\ Mail Carrier\ Pigeon]
factory :my_object do
transient do
remove_used_value = -> (x,y) { x.reject { |a| a == y }.sample }
end
first_contact_option { contact_methods.sample }
second_contact_option { remove_used_value.call(contact_methods,first_contact_option) }
end
但是,当我运行FactoryBot.create(:my_object)
时,出现错误undefined method remove_used_value for #<FactoryBot::SyntaxRunner:0x00007fb2ac238960>
我将其定义为lambda,因为在Bot中还有其他一些字段需要此功能。奇怪的是,昨天的代码工作正常,只是lambda中的逻辑未返回预期的结果。在重新设计逻辑并在CLI中测试了lambda之后,我发现了可以正常工作的逻辑,但是突然之间却没有意识到lambda在那里。
我的定义有问题吗?另外,还有一种更喜欢的方式来做类似的事情吗?
最有可能取代此作业
remove_used_value = -> (x,y) { x.reject { |a| a == y }.sample }
具有通过块定义的适当动态属性
remove_used_value { -> (x,y) { x.reject { |a| a == y }.sample } }
将解决问题。
((老实说,我会避免这种我无法完全控制的对象属性的随机化-这通常会导致不稳定的规范突然失效,甚至更糟糕的是,应用程序中的细微错误规范未捕获的逻辑;但是我知道这对于特定用例可能是一个很好的解决方案)