调用生成对象的测试方法

时间:2010-05-11 14:51:32

标签: ruby-on-rails ruby unit-testing mocha

我有以下控制器测试用例:

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

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

end

这很好,除了我希望“stubs(:plainversion)”是“expect(: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

同样,我无法弄清楚如何可靠地测试“解析”方法提供的“清洁”。有什么建议吗?

2 个答案:

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

目前尚不清楚发生了什么。让我觉得有一个更简单的版本。清理器只是一个简单的函数,它接受一个字符串并返回另一个字符串?跳过所有屈服和变量范围?这将更容易测试。

答案 1 :(得分:0)

您可能会发现Mocha::Expectation#yields的文档很有用。

我试图展示你如何在this gist中做你想做的事。请注意,我必须稍微调整代码才能将其转换为自包含的可运行测试。