1

我有一个 ASP.NET Web 服务,我正在尝试为其编写单元测试。我需要测试的一件事是从 Web 服务生成的 WSDL 文件是否符合某些标准。但是,如果不实际向 Web 服务发出 HTTP 请求,我不知道如何获取 WSDL 文件。

想做的是这样的(伪代码):

using System.Web;
using System.Web.Services;

[WebService]    
class MyWebService : System.Web.Services.WebService
{
    [WebMethod]
    string PopNextItem()
    {
        // Retrieve a string from the database and then delete that record.
    }
}

(剪断)

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
class WebServiceTest
{
    bool CheckWSDLMeetsCriteria(string WSDL)
    {
        bool success = true;
        // Check file here
        return success;
    }

    [TestMethod]
    void WSDL_Should_Match_Criteria()
    {
        string generatedWSDL = getWSDL(MyWebService.PopNextItem);
        Assert.IsTrue(CheckWSDLMeetsCriteria(generatedWSDL));
    }
}

当然,没有getWSDL办法,也不知道怎么写。我想我可以从测试中调用 wsdl.exe 然后获取输出文件,但我希望有更好的方法。.NET 是否提供任何以编程方式生成 WSDL 文件的方法?

如果做不到这一点,我想我可以尝试使用对 IIS 的 HTTP 请求来检索 WSDL 文件。问题是当单元测试在本地机器上运行时,IIS 的本地实例可能不会运行。尝试从登台服务器或类似的东西获取 WSDL 文件可能会导致针对旧版本的服务进行测试(我本地计算机上的 Web 服务代码可能在登台服务器更新后发生了更改),或者更糟的是我可能没有互联网接入,将无法测试。

我很好奇其他人会推荐什么解决方案。你怎么看?

4

1 回答 1

1

到目前为止,我发现了两个可以实现的选项。

A.使用 ServiceDescriptionReflector 生成 WSDL 文件。[来源]

ServiceDescriptionReflector reflector = new ServiceDescriptionReflector(); 
reflector.Reflect(typeof(MyService), "http://localhost/vdir/Foo.asmx");

if (reflector.ServiceDescriptions.Count > 1){
  throw new Exception("Deal with multiple service descriptions later");
}

XmlTextWriter wtr = new XmlTextWriter(Console.Out); 
wtr.Formatting = Formatting.Indented; 
reflector.ServiceDescriptions[0].Write(wtr); 
wtr.Close();

B. 使用 Svcutil.exe 从编译的服务代码中导出元数据[来源]

于 2013-10-02T19:17:04.353 回答