在单元测试中托管WCF服务

4
我想对我的自定义ServiceHostFactory进行单元测试。不幸的是,当调用CreateServiceHost时,我收到了这个InvalidOperationException
“'ServiceHostFactory.CreateServiceHost'不能在当前托管环境中调用。此API要求调用应用程序在IIS或WAS中托管。”
为了绕过这个问题,我可以重构我的类,使其公开一个公共方法,该方法可以直接被单元测试调用,而不使用其继承的公共接口。但是只为了进行单元测试而更改我的接口让我感到不爽。我还看到另一个SO答案建议生成Cassini主机,但我不想以这种方式增加单元测试的复杂性。
有没有一种方法可以解决这个ServiceHostFactory限制,而不必采取这些措施?
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)
    {
        // ...
    }
}

1
这是我对这个问题的解决方案(我不确定我们是否应该这样做)。
在单元测试装置的设置中,设置一个托管环境(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));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接