【问题标题】:Hosting WCF service in Unit Test using ServiceHost使用 ServiceHost 在单元测试中托管 WCF 服务
【发布时间】:2011-04-26 11:31:52
【问题描述】:

我正在尝试编写一些单元测试来测试我的 WCF 服务的端点,为此我想在单元测试本身而不是在 IIS 中托管服务。我发现this article 已通读并进行了更改,因此我使用ServiceHost 托管它,我可以看到单元测试正在尝试运行它,但我似乎遇到了一些问题。

当我运行测试时,我在打开服务时收到以下错误:

此服务需要 ASP.NET 兼容性,必须托管在 IIS。在 IIS 中托管服务 打开 ASP.NET 兼容性 在 web.config 或设置 AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode 属性的值不是 必填。

这是由我的服务类的以下属性设置引起的:

[AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Required )]

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

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

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

【问题讨论】:

  • 这很容易解决:只需删除 ASP.NET 兼容性要求。不,说真的:你应该这样做。
  • 最后我做到了,只是删除了属性。我担心我一开始并不知道它存在的确切原因,但我想这就是我们进行单元测试、CI 和夜间构建的原因!!! :)
  • 当你开始错过HttpContext 时,你需要它回来;)当然,自托管会消失!

标签: .net asp.net wcf unit-testing mstest


【解决方案1】:

如错误消息所述,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 下运行 CI 构建时遇到问题……所以我最终选择删除该属性。
  • 您将如何更改被测项目的 web.config 以指向测试数据库和内容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多