代码之家  ›  专栏  ›  技术社区  ›  Todd R

对生成的对象调用的测试方法

  •  0
  • Todd R  · 技术社区  · 15 年前

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

    def test_showplain
      Cleaner.expect(:parse).with(@somecontent)
      Cleaner.any_instance.stubs(:plainversion).returns(@returnvalue)
    
      post :showplain, {:content => @somecontent}
    
    end
    

    这是控制器代码:

    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
    

    同样,我也不知道如何可靠地测试“parse”方法提供的“cleaner”。有什么建议吗?

    2 回复  |  直到 15 年前
        1
  •  0
  •   ndp    15 年前

    这有点棘手。最简单的方法是把问题分成两部分:控制器的测试和控制器的测试。

    您已经对控制器集进行了测试——只需除去对纯版本调用的期望。

    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
    

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

        2
  •  0
  •   James Mead    14 年前

    您可能会找到 Mocha::Expectation#yields 有用。

    this gist . 请注意,我不得不对代码进行一些调整,以使其成为一个独立的可运行测试。