ruby – RSpec嘲笑:每个块

我想使用RSpec模拟为块提供固定输入.

ruby:

class Parser
  attr_accessor :extracted

  def parse(fname)
    File.open(fname).each do |line|
      extracted = line if line =~ /^RCS file: (.*),v$/
    end
  end
end

RSpec的:

describe Parser
  before do
    @parser = Parser.new
    @lines = mock("lines")
    @lines.stub!(:each)
    File.stub!(:open).and_return(@lines)
  end

  it "should extract a filename into extracted" do
    linetext = [ "RCS file: hello,v\n","bla bla bla\n" ]

    # HELP ME HERE ...
    # the :each should be fed with 'linetext'
    @lines.should_receive(:each)

    @parser.should_receive('extracted=')
    @parser.parse("somefile.txt")
  end
end

这是一种通过将固定数据传递到其中来测试块内部正常工作的方法.但我无法弄清楚如何使用RSpec模拟机制进行实际喂食.

更新:看起来问题不是使用linetext,而是使用:

@parser.should_receive('extracted=')

这不是它被调用的方式,用红色代码替换它,self.extracted =有点帮助,但不知何故感觉不对.

解决方法

我没有配备Ruby& RSpec可以检查这个,但我怀疑你需要在should_receive(:each)的末尾添加对and_yields调用[1]的调用.但是,您可能会发现在这种情况下不使用模拟更简单,例如您可以从File.open存根返回包含linetext的StringIO实例.

[1] http://rspec.rubyforge.org/rspec/1.1.11/classes/Spec/Mocks/BaseExpectation.src/M000104.html

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...