私がテストしたいメソッドの内部で具体化された具体的なクラスを持つこのような設定があります。私はこの具体的なクラスを模擬し、コードを内部で実行しないようにしたい。そのため、例外がスローされるべきではない:具体的なクラスのメソッド呼び出しを呼び出す
public class Executor
{
public bool ExecuteAction(ActionRequest request)
{
switch (request.ActionType)
{
case ActionType.Foo:
var a = new Foo();
return a.Execute(request);
case ActionType.Bar:
var b = new Bar();
return b.Execute(request);
}
return true;
}
}
public class Foo
{
public virtual bool Execute(ActionRequest request)
{
throw new NotImplementedException();
}
}
public class Bar
{
public virtual bool Execute(ActionRequest request)
{
throw new NotImplementedException();
}
}
私のNUnitのテストは次のようになります。
[Test]
public void GivenARequestToFooShouldExecuteFoo()
{
var action = new Mock<Foo>();
action.Setup(x => x.Execute(It.IsAny<ActionRequest>())).Returns(true);
var sut = new Mock<Executor>();
sut.Object.ExecuteAction(new ActionRequest
{
ActionType = ActionType.Foo
});
}
[Test]
public void GivenARequestToBarShouldExecuteBar()
{
var action = new Mock<Bar>();
action.Setup(x => x.Execute(It.IsAny<ActionRequest>())).Returns(true);
var sut = new Mock<Executor>();
sut.Object.ExecuteAction(new ActionRequest
{
ActionType = ActionType.Bar
});
}
私はCallBase
の周りいじっが、それはどこでも私を取得できませんでした。とにかく、これらのクラスの依存性注入やインターフェイスの追加がなければ、これを簡単に解決できますか?これはMoqを使って可能ですか?
ExecuteメソッドをExecutorクラスに移動し、ExecuteFoo()
とExecuteBar()
に名前を変更するだけですが、移動するコードがたくさんあるので、部分クラス(サブクラス?)。
'Executor.ExecuteAction'メソッドを' virtual'にするとできます。しかし、テストが設計上の欠陥を検出する方法の1つであるという事実を考えれば、あなたが持っているものを再加工することをお勧めします。あなたが示したテストは実装との緊密な結合のために非常に脆弱であることは言うまでもありません(実際にここで 'switch'ステートメントをテストしていますか?) –