2012-09-14 81 views
4

我正在使用puts命令在我的應用程序中打印一些自定義消息。但是,我不希望這些出現在我的測試輸出中。所以,我嘗試了一種方法來存儲puts,如下所示。但它仍然輸出我的信息。我究竟做錯了什麼 ?有沒有辦法在Rails中模擬/存根「放入」

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

+1

嘗試磕碰[內核#看跌期權](http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i代替)。 –

+0

@CodeGnome:仍然沒有運氣,請參閱更新的問題 – bragboy

+0

我不知道爲什麼你的情況不掘根的作品,但壓倒一切的把全部工作: '''紅寶石 > Kernel.send(:define_method,:放)做 「」 結束 =># >提出 「foobar的」 => 「」 ''' 雖然在一般情況下,如果你的測試框架應該結果可能會奇怪,使用放置以及輸出。 – trueunlessfalse

回答

1

我會做的是定義一個自定義日誌方法(基本上要求放現在),你可以在測試很容易地嘲笑或沉默。

這也給你稍後做更多的選擇,比如登錄文件。

編輯:或者,如果您確實想要存根,並且您在實例方法中調用它,則可以將該存根的實例存根。

4

您可能需要將其存儲在調用puts的實際實例上。例如。如果你在一個User類的一個實例方法調用puts,嘗試:

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

這同樣適用,當你試圖在頂層執行範圍測試puts到:

​​
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 
0

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

相關問題