2010-05-11 31 views
0

上我有以下控制器的測試案例:測試方法叫做產生對象

def test_showplain 
    Cleaner.expect(:parse).with(@somecontent) 
    Cleaner.any_instance.stubs(:plainversion).returns(@returnvalue) 

    post :showplain, {:content => @somecontent} 

end 

這工作得很好,但我想要的「存根(:plainversion)」是一個「希望(:plainversion)」 。

這裏的控制器代碼:

def showplain 
    Cleaner.parse(params[:content]) do | cleaner | 
     @output = cleaner.plainversion 
    end 
end 

和清潔很簡單:

class Cleaner 

    ### other code and methods ### 

    def self.parse(@content) 
    cleaner = Cleaner.new(@content) 
    yield cleaner 
    cleaner.close 
    end 

    def plainversion 
     ### operate on @content and return ### 
    end 

end 

同樣,我無法弄清楚如何可靠地測試的「清潔劑」,即提供從「解析」方法。有什麼建議麼?

回答

0

這有點棘手。最簡單的方法是將問題分成兩部分:控制器的測試和控制器的測試。

你有控制器設置的測試 - 只是移除你對plainversion調用的期望。

然後,分別地,您要測試Cleaner.parse方法。

cleaner = Cleaner.new('x'); 
cleaner.expects :close 

Cleaner.expects(:new).returns(cleaner) 

called_with = nil 
Cleaner.parse('test') do |p| 
    called_with = p 
end 
assert_equal p, cleaner 

這是不是很清楚發生了什麼事情。讓我覺得這有一個更簡單的版本。清潔可以是一個簡單的函數,需要一個字符串並返回另一個?跳過所有的屈服和變量範圍?這將更容易測試。

+0

解析方法的好處在於它提供了一個完全可以使用的清理器,並確保調用close。這在Cleaner類中得到了充分測試。儘管上面的代碼顯示了使用Cleaner來檢索「plainvesion」,但還有其他操作可以使用完全準備好的Cleaner來完成。 在控制器中,我們可以創建一個新的清潔器,確保它完全被管理,使用它,然後確保我們關閉它。但看起來如此。 。 。不是Rubyish。特別是當使用解析方法非常方便時,請使用Cleaner並完成它。 – 2010-05-14 14:20:34

+0

也許如果您只是將@output從塊中取出並傳回給調用者,那麼您的控制器方法將更容易測試 - 只需測試清潔器是否已被調用即可完成。如你所說,你的清潔劑在其他地方進行過測試 – ndp 2010-05-14 14:44:53

0

您可能會感興趣的文檔Mocha::Expectation#yields有用。

我試圖展示如何在this gist中做你想做的事情。請注意,我必須稍微調整一下代碼才能將其加入獨立的可運行測試中。