如何单元测试使用WCF Rest入门套件构建的WCF客户端
我使用REST入门套件创建了一些POX服务。 首先,为服务层创建单元测试有点复杂,但最终设计得很好,我成功地嘲笑了上下文并设置了期望值。如何单元测试使用WCF Rest入门套件构建的WCF客户端
但是,我现在从客户端开始,并且在解决如何模拟事情时遇到一些问题。它并不那么直截了当。
所以,我有这个示例方法通过HTTP发送一些数据使用datacontract和XML作为传输。
public class ServiceClient: IService
{
private const string uri_template = "http://{0}:{1}/SomeService.svc/";
private readonly HttpClient http = new HttpClient();
public ServiceClient(string host, int port)
{
http.BaseAddress = new Uri(string.Format(uri_template , host, port));
}
public void Create(MyDataContract my_data_contract)
{
var content = HttpContentExtensions
.CreateDataContract(
my_data_contract,
Encoding.Default,
"text/xml",
null);
var response = http.Post("Create", content);
if (response.StatusCode != HttpStatusCode.Created) {
throw new Exception("something is not right");
}
}
}
此方法正在工作,并确实发布数据和正确序列化。
我想要做的是单元测试它。
我的问题是:
如何使存根/嘲笑为HttpContextExtensions知道它没有实现任何接口?
而对于HttpClient?这是最糟糕的,因为它充满了其他地方定义的扩展方法(Post和类似方法是扩展)。
在2.我想我可以坚持到“发送”和它的过载,但随后是同样的问题,因为在1
我在想什么做的,是提取接口,HttpContextExtensions和HttpClient,为每个孩子创建一个子对象并实现委托给父对象的接口,然后使用我的代码中的接口。
但这是很多工作恕我直言。
我使用RhinoMocks作为我的嘲笑框架,所以我不能模拟/存根具体类,我想坚持下去,因为我真的认为嘲笑具体类不是很优雅。
那么,有没有一种更清洁/更快/更聪明的方式来测试代码如上?
PD:这是WCF入门套件预览2
如果你真的想嘲笑的代码,这种方式可以为这种情况下的工作尚处于ServiceClient类来接收HttpClient的实例。 HttpClient类包含一个处理管道,您可以使用自定义处理程序进行自定义。对于测试,基本上可以在该httpclient实例中注入一个处理程序,以便在最后一个处理程序(传输阶段)中调用真实服务之前返回测试的模拟响应。看看这篇文章,以获取有关如何可以实现一个想法,
问候, 巴勃罗。
谢谢Pablo。 我接受了你的建议,但给了它一个简单的暗示,但仅仅因为是我所需要的。 我跟着你的作品在这里http://weblogs.asp.net/cibrax/archive/2009/03/13/httpclient-in-the-wcf-rest-starter-kit-preview-2.aspx并制作了我自己的HttpStage子类仅用于测试目的,并可配置为返回任何响应。谢谢。 – 2009-05-12 02:42:14
我写了大部分的HttpClient代码。 Pablo的建议是我在单元测试中所做的 - 请参阅源zip中的FixedTransport.cs。
我不知道为什么我没有想到在试剂盒的来源。明显!! > _ <... class="text-secondary"> 2009-08-04 19:14:00
也许我可以按照Pablo M. Cibraro的建议添加一些自定义阶段:http://weblogs.asp。net/cibrax/archive/2009/03/13/httpclient-in-the-wcf-rest-starter-kit-preview-2.aspx – 2009-05-05 13:58:23