rspec测试中let和allow之间的区别。两个存根?

时间:2016-04-11 22:52:21

标签: rspec

我有这种方法,我试图测试:

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会将方法存储在实际代码中的任何地方吗?

1 个答案:

答案 0 :(得分:3)

letallow做了截然不同的事情。 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方法的对象上使用实际的allowbuild(您在上面的示例代码中未命名) 。这是您似乎想要做的标准做法。 在这种情况下,是的,它确实将存在于方法中,正如您所期望的那样。