0

我对 rspec 相当陌生,想编写测试以rspecRuby. 我该怎么做?另外,解释一下测试。谢谢

4

2 回答 2

2

通过使用模拟:

STDIN.should_receive(:read).and_return("your string")

我也喜欢这里描述的方法。我认为最后一个更适合你的情况。

于 2012-09-18T13:46:19.340 回答
2

一般的方法是使此类对象可交换。在您的情况下,gets隐式调用 on $stdin。因此,您可以创建一个名为“input”的可选参数,该参数默认为$stdin并调用 get 。

这是一个简单的计算器示例,它接受一些输入并返回结果。

class Calculator
  def initialize input = $stdin
    @input = input
  end

  def process
    eval @input.gets
  end
end

现在你可以运行puts Calculator.new.process,输入1 + 2,你会看到3

您不需要任何特殊工具来测试它,因为您可以轻松地传递一个 IO 对象并在测试中直接写入它。IO.pipe 是一个不错的选择:

describe "Calculator" do
  before do
    reader, @writer = IO.pipe
    @calc = Calculator.new(reader)
  end

  it "can sum up two numbers" do
    @writer.puts "1 + 2"
    result = @calc.process
    result.should eq(3)
  end
end

您也可以使用 StringIO 代替,它不是真正的 IO,并且不需要类似 UNIX 的环境。尽管每次写入时都需要倒带流。

require "stringio"

describe "Calculator" do
  before do
    @input = StringIO.new
    @calc = Calculator.new(@input)
  end

  it "can sum up two numbers" do
    @input.puts "1 + 2"
    @input.rewind
    result = @calc.process
    result.should eq(3)
  end
end

这种方法与 stubbing 相比的优势在于不那么脆弱的测试和更好的设计。测试不那么脆弱,因为如果您决定更改实现并使用 getc 而不是获取(一个接一个地读取字符),例如您将不需要更改测试。而且设计更好,因为现在您可以轻松地从不同的来源(例如文件)发出命令Calculator.new(File.open("calculated_list.txt"))。或者你可以在测试中使用的假 IO!

于 2012-09-18T16:07:09.130 回答