4

我想对我的 custom 进行单元测试ServiceHostFactory。不幸的是,我InvalidOperationException在打电话时得到了这个CreateServiceHost

'ServiceHostFactory.CreateServiceHost' 不能在当前宿主环境中调用。此 API 要求调用应用程序托管在 IIS 或 WAS 中。

我可以通过重构我的类来解决这个问题,以便它公开一个可以由单元测试直接调用的公共方法,而不是使用其继承的公共接口;我讨厌仅仅为了单元测试而改变我的界面。我还看到另一个建议生成 Cassini 主机的 SO 答案,但我不想以这种方式使我的单元测试复杂化。

ServiceHostFactory有没有办法在不采取这些措施的情况下解决这个限制?

4

2 回答 2

5

我弄清楚了这个问题。在我的自定义ServiceHostFactory中,我只覆盖了受保护的方法,CreateServiceHost(Type serviceType, Uri[] baseAddresses). 通过覆盖公共CreateServiceHost(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 回答