使用ServiceHost在单元测试中托管WCF服务

7
我正在尝试编写一些单元测试来测试我的WCF服务的端点,并且为此我想将服务托管在单元测试中,而不是在IIS中。 我找到了这篇文章并阅读后进行更改,以便使用ServiceHost进行托管,我可以看到单元测试正在尝试运行它,但我好像遇到了一些问题。
当我运行测试时,在打开服务的地方我会得到以下错误:
“此服务需要ASP.NET兼容性,必须在IIS中托管。请在web.config中打开具有ASP.NET兼容性的IIS托管服务或将AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode属性设置为除Required之外的值。”
这是由于我的服务类上的以下属性设置引起的:
[AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Required )]

我已经尝试将以下内容添加到我的app.config文件中,但似乎没有任何区别:

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

有什么办法可以解决这个问题吗?

1
很容易解决:只需删除ASP.NET兼容性要求即可。不开玩笑:你应该这样做。 - Mark Seemann
最后我这样做了,只是移除了这个属性。我担心一开始不知道它存在的确切原因,但我想这就是为什么我们有单元测试、CI和夜间构建的原因!!! :) - Richard Hooper
当你开始想念 HttpContext 时,你会需要它的。那么,自托管当然就不再适用了! - Ε Г И І И О
1个回答

10

正如错误提示所述,ASP.NET兼容模式要求WCF服务在ASP.NET Web服务器中托管

如果您希望在本地计算机上运行一些集成测试来测试您的WCF服务,您可以将该服务托管在Visual Studio开发服务器(也称为Cassini)。我强烈建议您查看CassiniDev,这是一个开源库,允许在进程中运行轻量级ASP.NET Web服务器,特别适用于单元测试场景。

以下是使用MSTest进行单元测试时如何使用CassiniDev的示例:

[TestClass]
public class MyServiceTest
{
    private CassiniDevServer host;

    [TestInitialize]
    public void SetUp()
    {
        var host = new CassiniDevServer();
        host.StartServer(@"RelativePathToServiceProjectDir", 8080, "/", "localhost");
    }

    [TestCleanup]
    public void TearDown()
    {
       host.StopServer();
    }
}

相关资源:


谢谢你提供CassiniDev的指引,它真的很酷!我尝试将其集成进来,在我的机器上运行得非常完美,但是在TeamCity进行持续集成构建时遇到了一些问题...所以最后我选择移除了这个属性。 - Richard Hooper
您要如何更改受测项目的web.config以指向测试数据库等内容? - Ε Г И І И О

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