5

我正在使用 puts 命令在我的应用程序中打印一些自定义消息。但是,我不希望这些出现在我的测试输出中。所以,我尝试了一种存根方法puts,如下所示。但它仍然输出我的信息。我究竟做错了什么 ?

stubs(:puts).returns("") #Did not work out
Object.stubs(:puts).returns("") #Did not work out either
puts.stubs.returns "" #Not working as well
Kernel.stubs(:puts).returns "" #No luck

我在用Test::Unit

4

4 回答 4

7

您可能需要在调用puts. 例如,如果您正在调用类puts的实例方法User,请尝试:

user = User.new
user.stubs(:puts)
user.some_method_that_calls_puts

当您尝试puts在顶级执行范围内进行测试时,这同样适用:

self.stubs(:puts)
于 2012-09-14T18:14:06.580 回答
1

我要做的是定义一个自定义日志方法(现在基本上调用 puts),您可以很容易地在测试中模拟或静音。

这也为您提供了稍后使用它执行更多操作的选项,例如登录到文件。

编辑:或者如果你真的想存根puts,并且你在一个实例方法中调用它,你可以只在那个类的实例上存根puts。

于 2012-09-14T12:43:58.100 回答
1

使用 Rails 5 + 摩卡:$stdout.stubs(puts: '')

于 2016-03-17T06:40:28.437 回答
0

因此,对原始帖子的评论指向答案:

Kernel.send(:define_method, :puts) { |*args| "" }

我不会使所有输出静音,而只会使测试期间放置的特定对象的输出静音。

class TestClass
  def some_method
    ...
    puts "something"
  end
end

it "should do something expected" do
  TestClass.send(:define_method, :puts) { |*args| "" }
  test_class.some_method.should == "abc123"
end
于 2013-05-16T16:14:40.350 回答