我有这种方法,我试图测试:
def build
return if !cookies["__utmz"] && !cookies["__utma"]
binding.pry
@data = GaCookieParser::GaCookieParser.new(
utmz: cookies["__utmz"],
utma: cookies["__utma"]
)
build_utmz
build_utma
TrafficSource.new(params)
end
这是我的测试:
context 'when cookies have necessary params' do
let(:cookies) { complete_cookies }
let(:complete_cookies) do
{
'__utmz' => 'something',
'__utma' => 'something'
}
end
我使用了let,当我点击绑定时," cookies"确实让我回到了complete_cookies。
让我们只能"存根"测试权限内的方法,而allow会将方法存储在实际代码中的任何地方吗?
答案 0 :(得分:3)
let
和allow
做了截然不同的事情。 let
不是方法存根...它是一种在测试中创建测试数据/对象的方法。
let
是一种更好的做法,如:
before do
@cookies = { '__utmz' => 'something', '__utma' => 'something' }
end
然后必须在测试中使用@cookies
。
它比在实例化块之前实例化更好,因为在实际使用它之前它不会被实例化 - 这减少了在所有测试中都没有使用的对象的实例化。
如果你真的想要存根方法,你必须使用receives
期望,例如:
allow(thing).to receive(:cookies).and_return(complete_cookies)
expect(thing).to receive(:cookies).and_return(complete_cookies)
我认为,您所看到的行为并非您所期待的......因为您意外完成的是使用本地变量的方法cookies
的论文叫cookies
...
哪个有点危险,可能很脆弱。
在这种情况下,我会在包含expect
方法的对象上使用实际的allow
或build
(您在上面的示例代码中未命名) 。这是您似乎想要做的标准做法。
在这种情况下,是的,它确实将存在于方法中,正如您所期望的那样。