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 を呼び出す) を定義することです。

これにより、後でファイルにログを記録するなど、後でさらに多くのことを行うオプションも提供されます。

編集:または、本当にプットをスタブ化したい場合、たとえばインスタンスメソッド内で呼び出している場合は、そのクラスのインスタンスでプットをスタブ化できます。

于 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 に答える