2010-05-11 87 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中做你想做的事情。请注意,我必须稍微调整一下代码才能将其加入独立的可运行测试中。