我将代码库从1.8升级到1.9。我在我的代码中遇到了几个地方(只有规格,不确定这是不是巧合),哪里有没有变量的块有问题。给他们一个虚拟变量可以解决这个问题。这是一个例子:
在工厂女工厂,这工作在1.8:
Factory.define :thing do |t|
t.price { 1 - 0.01*rand(10) }
end
在1.9以下,rand(10)
会返回nil
。很奇怪。我正在绞尽脑汁为什么环境会在街区内变得不同。问题是,rand
甚至不是来自标准库 - 它来自核心语言!所以环境并没有真正改变的方式。
然后我记得我的规格中的其他一些地方因为无变量的块而破坏了,所以一时兴起我扔了一个,然后看到它有效。
Factory.define :thing do |t|
t.price { |dummy| 1 - 0.01*rand(10) }
end
这里发生了什么?
答案 0 :(得分:2)
在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