4

カスタムを単体テストしたいと思っていますServiceHostFactory。残念ながら、私はInvalidOperationException電話するときにこれを受け取りますCreateServiceHost

'ServiceHostFactory.CreateServiceHost'は、現在のホスティング環境内では呼び出すことができません。このAPIでは、呼び出し元のアプリケーションがIISまたはWASでホストされている必要があります。

継承されたパブリックインターフェイスを使用する代わりに、単体テストによって直接呼び出すことができるパブリックメソッドを公開するようにクラスをリファクタリングすることで、これを回避できます。単体テストのためだけにインターフェイスを変更するのは嫌いです。カッシーニホストを生成することを推奨する別のSO回答も表示されますが、この方法で単体テストを複雑にするのは嫌です。

ServiceHostFactoryこれらの対策に頼らずにこの制限を回避する方法はありますか?

4

2 に答える 2

5

私はその問題を理解しました。私の習慣ServiceHostFactoryでは、保護されたメソッドをオーバーライドしただけでしたCreateServiceHost(Type serviceType, Uri[] baseAddresses)。publicCreateServiceHost(string constructorString, Uri[] baseAddresses)メソッドをオーバーライドすることで、問題なくサービスホストファクトリを構築することができました。

前:

public class MyServiceHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        // ...
    }
}

後:

public class MyServiceHostFactory : ServiceHostFactory
{
    public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
    {
        return this.CreateServiceHost(typeof(MyService), baseAddresses);
    }

    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        // ...
    }
}
于 2012-07-19T20:09:54.543 に答える
1

これがこの問題に対する私の解決策です(これを行うべきかどうかは100%わかりません)。

単体テストフィクスチャのセットアップで、ホスティング環境をセットアップします(NUnitの例)。

[TestFixtureSetUp]
public void TestFixtureSetup()
{
    if(!HostingEnvironment.IsHosted)
    {
        // The instance constructor hooks up the singleton hosting environment, ewww...
        new HostingEnvironment();

        // Check the hosting environment is fully initialized
        ServiceHostingEnvironment.EnsureInitialized();
    }
}

ServiceHostFactory次に、単体テスト内からカスタムを自由に使用できるはずです。

[Test]
public void ServiceHostIsCorrect()
{
    // Arrange
    var serviceType = typeof (string);
    var factory = new UnityServiceHostFactory();

    // Act
    var serviceHost = factory.CreateServiceHost(serviceType.AssemblyQualifiedName, new Uri[] {});

    // Assert
    Expect(serviceHost, Is.TypeOf<UnityServiceHost>());
    var unityServiceHost = (UnityServiceHost)serviceHost;
    Expect(unityServiceHost.Description.ServiceType, Is.EqualTo(serviceType));
}
于 2013-05-28T15:11:35.800 に答える