我将代码库从1.8升级到1.9.我在我的代码中遇到了几个地方(只有规格,不确定这是不是巧合),哪里有没有变量的块有问题.给他们一个虚拟变量可以解决这个问题.这是一个例子:
在工厂女工厂,这工作在1.8:
Factory.define :thing do |t|
t.price { 1 - 0.01*rand(10) }
end
在1.9以下,兰特(10)返回零.很奇怪.我正在绞尽脑汁为什么环境会在街区内变得不同.问题是,rand甚至不是来自标准库 – 它来自核心语言!因此,实际上没有一种方法可以改变环境.
然后我记得我的规格中的其他一些地方因为无变量的块而破坏了,所以我一时兴起就扔了一个,并且看到它有效.
Factory.define :thing do |t|
t.price { |dummy| 1 - 0.01*rand(10) }
end
这里发生了什么?
最佳答案 在factory_girl的最新版本中,定义没有块参数的属性使用instance_eval,并且它假定裸方法调用正在寻找先前的属性定义,模型上的方法或诸如“create”或“build”的语法方法.
为了使“open”或“file”等属性正常工作,代理对象取消定义包括“rand”在内的大多数私有方法.这意味着您需要使用“Kernel.rand”而不仅仅是“rand”.
您可以在此处查看相关来源:https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/evaluator.rb#L16