当运行测试时,与其它测试的运行并没有差别。在常规案例中,需要保证Web服务的宿主服务器在测试运行之前已经启动。但是本示例中,Visual Studio承载测试框架,并用于开发和承载Web服务(同本例),Visual Studio Web服务器(Cassini)按需求启动。另外,在常规案例中,如果重新部署Web服务,那么必须在新位置指定Web服务客户端配置信息文件。但是,这种情况下Visual Studio承载测试框架,并用于开发和承载Web服务,它自动实现这些操作。
当Web服务由Cassini承载,并且尝试在Visual Studio意外运行时(例如Mstest.exe、命令行测试工具、或者Team Foundation Server的Team Build),该测试就会出现问题。无论是Mstest.exe,还是Team Foundation Server的Team Build都不能启动Cassini,即使能够启动,它们也没有向代理传送Cassini所选动态端口的方法。在这个示例中,需要获取测试框架才能实现所有重要功能。为了通知测试框架启动Cassini监听专用虚拟目录(映射专用物理目录)的请求,需要应用AspNetDevelopmentServer属性。另外,需要使用WebServiceHelper类的TryUrlRedirection方法通知端口代理Cassini选择的监听端口,测试框架信息存储在TestContext中的。注意PathToWebRoot变量用于避免Cassini使用的硬编码物理地址。这个变量在Visual Studio“工具”菜单的“选项”设置,然后为设置应用程序根目录,如图13所示。

图13 设置PathToWebRoot变量
[TestClass()]
public class WebUnitTests
{
[TestMethod()]
[AspNetDevelopmentServer("mysettings",
@"%PathToWebRoot%\MyWebSite", "/MyWebSite")]
public void AddTest()
{
CalcWebService target = new CalcWebService();
int x = 1;
int y = 2;
int expected = 3;
int actual;
WebServiceHelper.TryUrlRedirection(
target, TestContext, "mysettings");
actual = target.Add(x, y);
Assert.AreEqual(expected, actual);
}
}
public class WebUnitTests
{
[TestMethod()]
[AspNetDevelopmentServer("mysettings",
@"%PathToWebRoot%\MyWebSite", "/MyWebSite")]
public void AddTest()
{
CalcWebService target = new CalcWebService();
int x = 1;
int y = 2;
int expected = 3;
int actual;
WebServiceHelper.TryUrlRedirection(
target, TestContext, "mysettings");
actual = target.Add(x, y);
Assert.AreEqual(expected, actual);
}
}