2012-02-07 3 views
9

私は後続の呼び出しの検証を実行しようとしていたと私はMOQこのためInSequence()メソッドをサポートしていることを見つけ、のような:私は「厳しい」として模擬動作を指定するときMockBehavior.LooseでmoqのInSequence()を使用できますか?

MockSequence s = new MockSequence(); 
validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true); 
encryptor.InSequence(s).Setup(m=>m.Encrypt(It.IsAny<Frame>())); 
socket.InSequence(s).Setup(m => m.Send(It.IsAny<Frame>())); 
compressor.InSequence(s).Setup(m => m.Compress(It.IsAny<Frame>())); 

はしかし、これが唯一の動作しているようですこれは、嘲笑されたオブジェクトの追加のメドを呼び出すことを禁じます。しかし、私はこれらのオブジェクトの他のメソッドを呼び出すことができるようにしたい、私はちょうどこの呼び出しを順番に実行したい。

.Callback()と手作業による実装ではなく、そのための「サポートされている」方法はありますか?私はmoq.sequenceと呼ばれる追加ライブラリを見つけましたが、プリコンパイルされたバージョンは最新のMoqでは動作しません。

答えて

9

私は、SVNブラウザのMoqのソースコードを掘り下げて調べました(問題のmoqバージョンはMoq.4.0.10827.Finalです)。

私の調査はに私を導いた:InSequence()メソッドを見ていることで http://code.google.com/p/moq/source/browse/trunk/Source/MockSequence.cs?spec=svn751&r=712

、私は今、全体の実装はWhen()法に基づいていることがわかります。

ので、現実には、次のコード:

validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true); 

のようなものとして終わる:つまり

validator.When(/* call is made in sequence */).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true); 

、これは単に条件付き動作を設定している - メソッドがあるとき指定されたSetup()が順番に呼び出されます。それ以外の場合は、デフォルト実装が実行されます。そして厳密なモックのために、デフォルトの実装は例外をスローすることです(コールは指定されていないものとして扱われます)ので、ソリューション全体が機能します。

したがって、現在の解決策が緩いモックで動作するようになっているようですが、かなり面倒です。私はCallback()をベースにした手作りのソリューションに固執しています(ところで、うまく包まれているかもしれません)。しかし、コールバックを他の手段に使うことはできません。

私は有用であることを願ってこの回答を投稿しています。

+0

このすべてを** Moq's Issues **サイトに投稿しましたか?あなたはその主題を研究しなければならなかったので、私はそれがドキュメンテーションで説明されていないと仮定します。つまり、彼らはこの問題を認識していないかもしれません。私はそこに投稿された問題/提案を調べることを保証することができます。それは時間がかかりますが、彼らはします。私は自分自身でいくつかの便利なパッチを送ってきました(代理人をカウントする、Count-callsなど)。あなたが関与したくなければ、私は問題を再確認してそこに登録することができますが、あなたは既に詳細を知っているので、あなたはそれをはるかに良く説明するでしょう:) [btw。 sorki、niechciałempolskimmieszaćna SO :)] – quetzalcoatl

+0

こんにちは、ケツァルコアール。私はMoqが実際に維持されていることを知らなかったし、Moqのための少なくとも2つまたは3つのソースコードリポジトリがある。これは現在のものですか:https://github.com/Moq/moq4? クリスマス前と新年の前に数日間休暇を取る予定ですので、何かをまとめたり、少なくともさらに調査してみることにします。 –

+0

はい、確かに、現在のものはGitHubのものです。以前はMoqがcode.googleでホストされていましたが、最近GitHubに移りました。 GitHubに掲載されている問題リストは最新のものであり、そこに新しい問題が報告されるはずです。報告された「古い」問題や機能リクエストの数のため、code.googleのサイトはまだ存在し、削除/削除されていません。それらをインポートする方法がないので、GitHub、IIRCに移動されませんでした。本当に誰も手でコピー・ペーストする必要はありませんでした。それらはまだ検討されていますが、私はGitHubの問題は古いcode.googleよりも自然な優先順位を持っていると思います。 – quetzalcoatl

関連する問題