RSpec:短桩内部出租

RSpec:短桩内部出租,rspec,Rspec,这可能吗 例如: let(:codes) do [double.stub(:msg => 'foo'), double.stub(:msg => 'bar')] end expect(codes[0].msg).to eq('foo') expect(codes[1].msg).to eq('bar') 但它引发了以下错误: NoMethodError: undefined method `msg' for {:msg=>"foo"}:Hash 及 对于

这可能吗

例如:

let(:codes) do
  [double.stub(:msg => 'foo'), double.stub(:msg => 'bar')]
end

expect(codes[0].msg).to eq('foo')
expect(codes[1].msg).to eq('bar')
但它引发了以下错误:

NoMethodError:
       undefined method `msg' for {:msg=>"foo"}:Hash

对于
鼠标
,返回
[nil,nil]


有什么帮助吗?

问题是,至少对于rspec3来说,
存根方法本身不会返回正在存根的双精度。在您的情况下,它返回传递给它的哈希,如下所示:

describe 'RSpecs double behavior' do
  describe '#stub' do
    it 'returns the hash passed into it' do
      expect(double.stub(msg: foo)).to eq({msg: 'foo'})
    end
  end
end
这似乎与事实相反,但事实上,我认为这种行为是故意的

请参阅Myron Marston的答案,了解避免使用
存根
,并且仅依赖
双精度
的替代方法

另外,我认为在这些问题上,在示例中使用有效的RSpec语法是有帮助的。在本例中,您省略了所需的
description
it
方法

这似乎与RSpec 2.3文件相反

对不起,这里的2.3文档是错误的:(

RSpec 3.0文档对此没有提及,基于此讨论,我认为这种行为是故意的

这是故意的,因为
存根
旨在支持流畅的界面(
with
和_return
和_raise
,等等),所以它需要返回一个消息期望值。如果您想打开文档,我们欢迎一个PR来改进文档:)

无论如何,您可以将方法名/返回值的散列传递给
double
,因此根本不需要使用
stub

describe 'stack overflow question' do
  let(:codes) do
    [double(msg: 'foo'), double(msg: 'bar')]
  end

  it "let's you call stub within let" do
    expect(codes[0].msg).to eq('foo')
    expect(codes[1].msg).to eq('bar')
  end
end
double
上的文档提到:

describe 'stack overflow question' do
  let(:codes) do
    [double(msg: 'foo'), double(msg: 'bar')]
  end

  it "let's you call stub within let" do
    expect(codes[0].msg).to eq('foo')
    expect(codes[1].msg).to eq('bar')
  end
end