2つのWCFサービスを開いているWindowsサービスがあります。OnStart()の単体テストを行い、service1.Open()とservice2.Open()が呼び出されていることを表明したいと思います。OnStart()は次のようになります。
protected override void OnStart(string[] args)
{
// host WCF services
_service1.Open();
_service2.Open();
}
私はコンストラクターのオーバーロードにサービスを注入しています:
public WinService(ServiceHostBase service1,
ServiceHostBase service2)
{
_service1 = service1;
_service2 = service2;
InitializeComponent();
}
私はRhinoMocksを使用して、次のようなServiceHostBaseのスタブを生成しています。
[TestMethod()]
public void WinServiceOnStartCallsDependenciesAsExpected()
{
ServiceHostBase service1 = MockRepository.GenerateStub<ServiceHostBase>();
ServiceHostBase service2 = MockRepository.GenerateStub<ServiceHostBase>();
WinService target = new WinService(service1, service2);
WinService_Accessor privateTarget = new WinService_Accessor(new PrivateObject(target));
privateTarget.OnStart(null);
テストでOnStart()を呼び出すと、service1.Open()を呼び出すときにnull参照例外が発生します。その時点でservice1がモックオブジェクトであり、nullをスローしているのはOpen()であることを確認しました。Open()が実際にはSystem.ServiceModel.Channels.CommunicationObjectのメソッドであることを知っており、それもスタブまたはモッキングを試しましたが、それでもオブジェクト参照エラーが発生します。これは仮想メソッドではないため、モックバージョンによってオーバーライドされていないだけだと思いますが、Expectationを設定しようとするとreportservice.Stub(r => r.Open())
、実際のCommunicationObjectを実行しているかのように、デフォルトのタイムアウトがないという別の例外が発生します。 null参照をスローするRhinoMockyの代わりにOpen()メソッド。
つまり、ユニットテストでServiceHostでOpen()が呼び出されていることを確認する方法についてのヘルプを探しています。=]