测试 WCF Web 服务?
Posted
技术标签:
【中文标题】测试 WCF Web 服务?【英文标题】:Testing a WCF web service? 【发布时间】:2013-02-15 18:39:16 【问题描述】:我想为 WCF 服务创建一个测试类。我认为“嘲笑”是正确的说法?
我不确定我认为我必须这样做的方式是否正确。我已获得 WCF 服务的 URL,例如:
http:://somesite.com/wcf/RealService.svc
还有:
http:://somesite.com/wcf/RealService.svc?wsdl
因此,我没有将RealService.svc
以Service Reference
的形式实际添加到我的项目中,而是在我的名为Service1
的项目中添加了一个新的空WCF Service
。
然后我想使用wsdl.exe
(或者可能是 svcutil.exe?)工具从 WSDL url 生成接口:http:://somesite.com/wcf/RealService.svc?wsdl
。
然后我打开Service1.cs
文件,而不是让它从IService1.cs
继承,而是让它从生成的interface
继承。
然后在我的应用程序中调用真正的服务,我只是调用我的Service1
类。这就是模拟 Web 服务的工作原理吗?
还需要弄清楚如何使用 svcutil 工具实际生成interface
(我读过我不能将 wsdl.exe 用于 WCF 服务?)。因此,任何关于这方面的提示都非常受欢迎!
【问题讨论】:
codeproject.com/Articles/318260/How-to-Mock-a-WCF-Service @Zaki - 我认为这篇文章的标题应该是“如何不模拟 WCF 服务” 【参考方案1】:许多需要触及的领域,都会尝试为您指明正确的方向:
如果您想测试(即传递输入、验证输出)您的 WCF 服务,请使用 Visual Studio GUI 工具 WCF Test Client
(MSDN 文章 here)。
如果您想对 WCF 服务进行单元测试(即为服务、业务、数据等编写单元测试),请使用流行的模拟框架(相关 SO 线程 here)。
如您所料,要为您的 WCF 服务生成代理,请使用 svcutil.exe 命令行实用程序(MSDN 文章 here)。该实用程序带有各种选项(语言、命名空间、配置文件等),因此请注意它们。
希望这会有所帮助。
【讨论】:
所以除了将服务引用添加到让我们说一个将为您生成客户端代理的新 C# 项目之外,这样做与使用 svcutil.exe 有什么区别。你为什么要使用它而不是仅仅添加对你的项目的引用,它会做同样的事情呢?或者可能不是。我试图在 WCF 中测试客户端代理来了解更多关于客户端代理的信息 @CoffeeAddict - 两种方法(项目参考或 svcutil)都可以完美运行。在前一种方法中,Visual Studio 做了一些“幕后魔术”并生成一堆文件,这样更容易更新。但是,在后一种方法中,您处理一个代理文件,但需要您再次运行该命令以进行更新。我更喜欢后者,因为我喜欢将一个代理文件提交到我的源代码管理中,而且我不介意通过命令行进行更新过程。有意义吗?【参考方案2】:您可以使用 svcutil.exe 生成您的代理(来自 Visula Studio:添加服务参考...)。这将生成您的客户端代理和服务接口。
例如您的服务 http:://somesite.com/wcf/RealService.svc?wsdl 我们将得到:
IRealService(接口) RealServiceClient(实现 IRealService 并扩展 System.ServiceModel.ClientBase)您可以创建一个模拟类来实现您的服务接口 (IRealService)。
在您的应用程序中,当您想要调用服务时,您可以使用工厂或 IOC 容器,而不是实例化具体的服务客户端 (RealServiceClient)。
这样您可以决定您的应用程序(或模块/组件)使用哪个实例:运行时的真实服务,测试时的模拟。
【讨论】:
我看到有人只是将他们的 WCF 项目引用添加到他们的 C# 测试项目中,甚至不需要向他们的 C# 项目添加服务引用,这是可能的还是正确的做法?此外,即使您正在注入服务实例,模拟的目的难道不是根本不使用服务实例吗?它应该是孤立的,所以模拟框架不会为您创建一个虚假的服务实例或类似的东西吗? 当您调用添加服务引用... 命令时,您将获得一些生成的代码,您可以将其用作常规代码。我的意思是,您可以引用生成 代理类 的程序集并使用它们,而无需再次调用 Add a Service Reference... 命令(在例如测试项目)。 问题是合约 (interfaces
) 和它们的实现 (classes
) 是在同一个文件中生成的(因此是同一个程序集),但没有什么能阻止你创建一个 mock
实现在您的测试项目中。
只要您的主应用程序处理interfaces
而不是具体实现,您就可以决定注入 真实服务实现或mock 类,例如当您正在测试或不想调用 真实 服务时(例如在原型设计时)。这就是嘲笑的意义。以上是关于测试 WCF Web 服务?的主要内容,如果未能解决你的问题,请参考以下文章