【问题标题】:ASP.NET unit testing Windows7/IIS7ASP.NET 单元测试 Windows7/IIS7
【发布时间】:2012-02-22 08:51:27
【问题描述】:

今天花了几个小时尝试针对 ASP.NET 项目编写一些单元测试。这是 Visual Studio 2010。

将 Windows 7 企业版与 IIS7 结合使用。

我采取的步骤是:

  1. 向解决方案添加了一个新的测试项目
  2. 打开了作为网站一部分的类文件 (Member.vb)
  3. 在类文件中右键单击“生成单元测试”
  4. 选择我要为其生成存根的方法,选择添加到我的测试项目,点击确定
  5. 在测试项目中打开生成的 MemberTest.vb 文件,在其中一个生成的测试中单击,单击“在当前上下文中运行测试”

在我的 带有 IIS6 的 Windows XP Professional 机器上执行这些精确步骤时,它可以正常工作。

但是在 IIS7 上的 Windows 7 Enterprise 机器上我得到:

指定的 URL ('http://localhost/MyProject') 没有 对应一个有效的目录。测试配置为在 ASP.NET 中运行 IIS 要求 URL 存在有效目录。网址可能是 无效或可能未指向有效的 Web 应用程序。

所以发生了什么,我可以确认我可以浏览到 http://localhost/MyProject 并且它显示完美。

我确信我在 Windows/IIS 中缺少某种配置,但我真的很茫然。

生成的测试方法:

<TestMethod(), _
 HostType("ASP.NET"), _
 UrlToTest("http://localhost/MyProject")> _
Public Sub MyMethodTest()
    Dim target As Member_Accessor = New Member_Accessor() ' TODO: Initialize to an appropriate value
    Dim CurrentVal As Short = 0 ' TODO: Initialize to an appropriate value
    Dim expected As Short = 0 ' TODO: Initialize to an appropriate value
    Dim actual As Short
    actual = target.MyMethod(CurrentVal)
    Assert.AreEqual(expected, actual)
    Assert.Inconclusive("Verify the correctness of this test method.")
End Sub

(交叉发布于ASP.NET Forums

【问题讨论】:

    标签: asp.net unit-testing windows-7 iis-7


    【解决方案1】:

    我今天遇到了同样的问题。经过一番研究,我找到了this thread,它建议我检查我的事件日志。这样做后,我发现了许多类似于以下的错误:

     (QTAgent32.exe, PID 12348, Thread 61) WebSites.GetWebServer: failed to
     create AspNetHelper:
     Microsoft.VisualStudio.Enterprise.Common.AspNetHelperException: The
     website metabase contains unexpected information or you do not have
     permission to access the metabase.  You must be a member of the
     Administrators group on the local computer to access the IIS metabase.
     Therefore, you cannot create or open a local IIS Web site.  If you
     have Read, Write, and Modify Permissions for the folder where the
     files are located, you can create a file system web site that points
     to the folder in order to proceed. --->
     System.Runtime.InteropServices.COMException: Unknown error
     (0x80005000)
    

    这让我找到了this blog post,这似乎已经解决了这个问题。

    我只需要转到“打开或关闭 Windows 功能”并添加 IIS 6 管理兼容性和所有四个子组件。我正在运行没有 Windows 身份验证选项的 Windows 7 Home Premium,但这似乎不是问题。试一试,看看是否能解决您的问题。

    【讨论】:

      【解决方案2】:

      这可能是权限问题。

      如果您使用的是默认目录 (C:\users\\Documents\Visual Studio 2010\Projects),则应用身份池在此处没有权限。您必须在 C:\webs 之类的地方创建一个项目,并确保应用程序池身份对该文件夹具有权限。

      请参阅 Rick Anderson 在http://blogs.msdn.com/b/rickandy/archive/2011/04/22/test-you-asp-net-mvc-or-webforms-application-on-iis-7-in-30-seconds.aspx 的博客文章,看看是否有帮助。

      【讨论】:

      • 谢谢,它在 c:\projects - 我找不到为应用程序池身份添加权限的方法,但是我所做的是将应用程序池使用的身份更改为“网络服务”并将此帐户的权限添加到该文件夹​​。它没有任何区别,仍然是同样的错误。
      • 对于它的价值,这里有一个关于如何在 IIS 中设置 AppPoolIdentity 的详细信息的链接(请参阅保护资源部分以授予它对文件夹的权限):Application Pool Identities
      • 使用引用的链接时间给 appPool 身份权限。应用池身份比网络服务更安全。
      【解决方案3】:

      如果您之前没有进行过单元测试,我真的建议您从尽可能干净地测试类的功能开始。尝试将您的功能分解成可以单独测试的小块,并且不依赖于 Web 上下文。

      查看此问题以了解有关 What is unit testing 的想法 这是MSDN Magazine article about testing 你也可以看看这个Blog。这些示例使用的是 NUnit,但如果您使用的是 MSTest,则主体是相同的。

      我也可以推荐 Roy Osheroves Book Art of unit testing

      如果 Member 类不依赖于 Web 上下文,则不需要 IIS,而可以这样做:

      <TestMethod()> _
      Public Sub MyMethodTest()
          Dim target = New Member() 
          Dim CurrentVal As Short = 0 ' TODO: Initialize to an appropriate value
          Dim expected As Short = 0 ' TODO: Initialize to an appropriate value
          Dim actual As Short
          actual = member.MyMethod(CurrentVal)
          Assert.AreEqual(expected, actual)
      End Sub
      

      【讨论】:

      • 感谢您的意见,但这并不能回答问题。我已经在尝试只测试一个类的一种方法。但是,所有类都是 Web 项目的一部分,而不是在单独的类库中,并且无法更改。
      • 您不需要将它们分解为单独的类。关键是您可以仅对 Member.vb 类及其成员进行单元测试,如果它与 Web 上下文没有任何依赖关系,则无需启动 IIS。
      • 我理解-但 Member 是在网站项目的上下文中定义的(在网站的 App_Code 中),而不是在测试类的范围内。我不想改变我的架构。我只是想让 Windows 7/IIS7 机器以与 Windows XP/IIS6 设置相同的方式工作——它在哪里工作。对不起,但这就是我的问题:)
      • 这个答案对我有帮助,所以即使晚了一年。 Mharlin 提出的观点(我认为):如果您可以在 without HostTypeUrlToTest 属性的情况下对其进行测试(他的代码在省略 @ 时是错误的987654326@,需要测试私有函数)然后你仍然测试它并且你确实验证了该方法。试一试并将其标记为答案...
      【解决方案4】:

      您可能需要在项目属性中启用“使用 IIS”,然后单击“创建虚拟目录”。您是否安装了 IIS Express?

      【讨论】:

      • 不是 IIS Express,而是随 Windows 7 Enterprise 安装的完整 IIS。我查看了单元测试项目的项目属性的每一页,但看不到名为“使用 IIS”的选项,这个选项在哪里?
      • web 项目属性:Web -> 服务器部分 -> 使用本地 IIS 服务器
      • 谢谢 - 设置正确,网络项目已经可以正常工作,只是测试项目没有。
      猜你喜欢
      • 2010-10-10
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多