おおよそ次のようなWebサービスを使用するクラスがあります。
public class MyService : IMyService
{
private readonly IAuxilaryService1 auxilaryService1;
private readonly IAuxilaryService2 auxilaryService2;
private readonly IAuxilaryService3 auxilaryService3;
private IWebService service;
public MyService()
{
auxilaryService1 = new AuxilaryService1();
auxilaryService2 = new AuxilaryService2();
auxilaryService3 = new AuxilaryService3();
}
public void DoSomething(
string Param1,
string Param2
)
{
service = new WebService(auxilaryService1, auxilaryService2, auxilaryService3);
var response = service.DoSomething(Param1, Param2);
/* ... */
}
そして、これを実行してこれをテストしようとする単体テスト:
プライベートモックwebService;
[SetUp]
public void SetUp()
{
webService = new Mock<IWebService>();
}
[Test]
public void MyService_DoSomethingTest()
{
IMyService myService = new MyService();
webService.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<string>()))
.Returns(new Response() { Status = "Foo"});
myService.DoSomething("Param1", "Param2");
webService.Verify(x => x.DoSomething(It.IsAny<string>(), It.IsAny<string>()));
}
まず第一に、これは「MyService」をテストするための良い方法です。第二に、何らかの理由でインターフェイスが適切にインターセプトされないため、私のテストでは、myService内のwebServiceに偽の応答を返すように要求しますが、実際のインスタンスは引き続き呼び出され、テストはSoap例外で失敗します。Moqにはインターフェースまたは仮想メソッドが必要ですが、インターフェースMockを提供しているのに、なぜそれをインターセプトしないのですか?何か案は?
カスタムのumbracoコンターワークフロータイプをテストしていて、コンストラクターを制御できないことを追加する必要があります。変更するとプロジェクトが壊れます。