2012-01-30 92 views
5

今天花了好几个小时试图针对ASP.NET项目编写一些单元测试。它是Visual Studio 2010.ASP.NET单元测试Windows7/IIS7

使用带有IIS7的Windows 7 Enterprise。

步骤我把为:

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

当在与IIS6机器上我Windows XP Professional的这些精确的步骤,它工作正常。

但是在IIS7Windows 7企业版的机器上,我得到:

指定的URL(的 'http://本地主机/ MyProject的')不 对应于一个有效的目录。配置为在 的IIS中运行的测试IIS需要URL的有效目录。该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

回答

1

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

+0

不是IIS Express,但安装了Windows 7 Enterprise的完整IIS。我已经查看了单元测试项目的每个项目属性页面,并且我看不到一个名为“使用IIS”的选项,该选项在哪里? – bgs264 2012-02-02 08:59:30

+0

的Web项目属性:Web - >服务器部分 - >使用本地IIS服务器 – Mharlin 2012-02-03 08:25:18

+0

谢谢 - 这是设置正确,Web项目已经正常工作,只是测试项目不。 – bgs264 2012-02-03 08:53:46

3

如果您之前还没有进行过单元测试,那么我会建议您从尽可能干净地测试类的功能开始。尝试将你的功能打破成小块,可以单独测试,无需依赖Web环境。

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

我也可以推荐罗伊Osheroves书Art of unit testing

在你情况下,如果会员类没有依赖于网络环境下,你不需要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 
+0

谢谢你的观点,但这不能回答这个问题。我已经试图测试一个类的一种方法。然而,所有的类都是Web项目的一部分,而不是在单独的类库中,并且不能更改。 – bgs264 2012-02-03 08:51:13

+0

你不需要把它们分开来分开课程。重点是你可以单元测试只有Member.vb类,它是成员,如果它没有任何依赖Web上下文,你不需要启动IIS。 – Mharlin 2012-02-03 09:06:31

+0

我明白 - 但会员是在网站项目的上下文中定义的(在网站的App_Code中),而不在测试类的范围内。我不想改变我的架构。我只是希望使Windows 7/IIS7机器以与Windows XP/IIS6设置相同的方式工作 - 它在哪里工作。对不起,但这就是我的问题:) – bgs264 2012-02-03 11:52:03

4

这可能是一个权限问题。

如果您使用的是默认目录(C:\ users \\ Documents \ Visual Studio 2010 \ Projects),那么应用标识池在那里没有权限。您必须创建一个类似C:\ webs的项目,并确保应用程序池标识具有该文件夹的权限。

请参阅里克安德森的博文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,看看是否有帮助。

+0

谢谢,它在c:\ projects中 - 我无法找到添加应用程序池标识权限的方法,但是我所做的是更改由应用程序池用于“网络服务”的身份,并将此帐户的权限添加到该文件夹​​。它没有任何区别,它仍然是一样的错误。 – bgs264 2012-02-09 10:21:37

+0

关于如何在IIS中设置AppPoolIdentity的更多信息,请参阅“保护资源”部分,以获取文件夹的权限:[Application Pool Identities](http://learn.iis.net) /page.aspx/624/application-pool-identities/)。 – timamm 2012-02-09 18:20:45

+0

使用引用的链接时间给appPool标识权限。应用程序池标识比网络服务更安全。 – RickAndMSFT 2012-02-18 01:37:33

3

今天我遇到了同样的问题。经过一番调查后,我发现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家庭高级版,但这似乎没有问题。试试看,看看能否为你解决问题。