私は変更できないコードがあります。理想的には、Publishメソッドを別のクラスに移動します。嘲笑は些細な操作になるだろう、と私は良いだろう。ここでは簡単な例を示します。私が何をしたいかMoq - 同じクラスの2つの関数を呼び出す、実際には1つ、模倣されたもの
public class Entity
{
private IController _controller;
// Omitted: Constructor where IController is assigned
public virtual int Process()
{
return Publish(_controller.DoSomeStuff());
}
public virtual int Publish(int val)
{
Console.WriteLine(val); // This is actually a call to an external system.
return val;
}
}
は本当のプロセスメソッドを呼び出すと嘲笑方法を公開しています。 _controllerの値もまた嘲笑されます。
私はMOQを使ってやってみました:
var mock = new Mock<IController>();
mock.Setup(m => m.DoSomeStuff()).Returns(11);
var mock2 = new Mock<Entity_Accessor>();
mock2.CallBase = true;
mock2.Setup(a => a.Publish(It.IsAny<int>())).Returns(999);
mock2.Object._controller = mock.Object;
int result = mock2.Object.Process();
Assert.AreEqual(999, result);
私はこのテストを実行すると、11の値は、私は本当のmock2.CallBase =を削除した場合、クラス全体が返す嘲笑される代わりに、999の返されますすべての関数のデフォルト値。
この場合、Processの元の実装を保持したままでPublishメソッドだけを模擬することはできますか?
TypemockやJustmockではない別の模擬フレームワークで上記を達成することは可能ですか(顧客が模擬ツールの複数のコピーに対して請求書を出しているかどうかは不明です)。
ありがとうございました!
リストされている処理方法は大幅に簡略化されています。処理の良いビットがそこに続きます。私がしたいのは、Processメソッドだけをテストすることです。私はテストメッセージを公開したくないので、Publishメソッドをスタブにしたい。私はすでにIControllerインターフェイスを模擬することができます。私ができないことは、Publishメソッドを模倣することです。 – user1156891
@ user1156891 - あなたのコメントに基づいて自分の答えを更新しました –