0

我是 RSpec 和 TDD 的新手。我想知道是否有人可以帮助我创建一个非常适合这个模块的测试:

module Kernel
  # define new 'puts' which which appends "This will be appended!" to all puts output 
  def puts_with_append *args
    puts_without_append args.map{|a| a + "This will be appended!"}
  end

  # back up name of old puts
  alias_method :puts_without_append, :puts

  # now set our version as new puts
  alias_method :puts, :puts_with_append
end

我希望我的测试检查“puts”中的内容是否以“这将被附加!”结尾。那是一个足够的测试吗?我该怎么做?

4

1 回答 1

2

最好的测试测试你想要实现的目标,而不是你如何实现它......将测试与实现联系起来会使你的测试变得脆弱。

因此,您尝试使用此方法实现的是在加载扩展程序时更改“puts”。测试 puts_with_append 方法并没有达到这个目标......如果你后来不小心将它重新命名为其他东西,你想要的 puts 更改将不起作用。

但是,在不使用实现细节的情况下进行测试会相当困难,因此,我们可以尝试将实现细节推送到它们不会改变的地方,比如STDOUT

只是测试内容

$stdout.stub!(:write)
$stdout.should_receive(:write).with("OneThis will be appended!")
puts "One"

全面测试

我将在接下来的一天左右把它变成一篇博文,但我认为你还应该考虑到你已经为一个和多个参数得到了想要的结果,并且你的测试应该易于阅读。我将使用的最终结构是:

需要“rspec” 需要“./your_extention.rb”

describe Kernel do
  describe "#puts (overridden)" do
    context "with one argument" do
      it "should append the appropriate string" do
        $stdout.stub!(:write)
        $stdout.should_receive(:write).with("OneThis will be appended!")
        puts "One"
      end
    end

    context "with more then one argument" do
      it "should append the appropriate string to every arg" do
        $stdout.stub!(:write)
        $stdout.should_receive(:write).with("OneThis will be appended!")
        $stdout.should_receive(:write).with("TwoThis will be appended!")
        puts("One", "Two")
      end
    end
  end
end
于 2013-01-10T01:46:18.033 回答