0

次のコントローラーのテスト ケースがあります。

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

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

end

「stubs(:plainversion)」を「expects(: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

繰り返しますが、「parse」メソッドから利用できる「クリーナー」を確実にテストする方法がわかりません。助言がありますか?

4

2 に答える 2

0

Mocha :: Expectation#yieldsのドキュメントが役立つ場合があります。

私はあなたがこの要点であなたが望むことをどのように行うことができるかを示すことを試みました。自己完結型の実行可能なテストにコードを入れるには、コードを少し調整する必要があることに注意してください。

于 2010-12-02T11:36:31.533 に答える
0

これは少しトリッキーです。最も簡単な方法は、問題をコントローラーのテストとコントローラーのテストの 2 つに分割することです。

コントローラー セットのテストが完了しました。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

何が起こっているのかはあまり明確ではありません。これにはもっとシンプルなバージョンがあると思います。クリーナーは、文字列を受け取り、別の文字列を返す単純な関数になることができますか? 譲歩と可変スコープをすべてスキップしますか? これにより、テストがはるかに簡単になります。

于 2010-05-13T15:51:51.263 に答える