有没有办法在Rails中模拟/存储“put”

时间:2012-09-14 11:57:27

标签: ruby ruby-on-rails-3 testing

我正在使用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 个答案:

答案 0 :(得分:4)

您可能需要在调用puts的实际实例上将其存根。例如。如果您在puts类的实例方法中调用User,请尝试:

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

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

self.stubs(:puts)

答案 1 :(得分:1)

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

这也为您提供了更多功能,例如登录文件。

编辑:或者如果你真的想要存根put,并且你在实例方法中调用它,例如,你可以只是存放该类的实例。

答案 2 :(得分:1)

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

答案 3 :(得分: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