【问题标题】:How to unit test a WCF Client built with WCF Rest Starter Kit如何对使用 WCF Rest Starter Kit 构建的 WCF 客户端进行单元测试
【发布时间】:2009-05-05 03:59:28
【问题描述】:

我使用 REST Starter 工具包创建了一些 POX 服务。 一开始,为服务层创建单元测试有点复杂,但最终,它设计得很好,我成功地模拟了上下文并设定了期望。

但是,我现在从客户端开始,在弄清楚如何模拟事物时遇到了一些问题。这不是那么直截了当。

所以,我有这个示例方法,它使用数据合同和 XML 作为传输通过 HTTP 发布一些数据。

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");
        }
    }
}

此方法有效,并且确实可以正确发布数据和序列化。

我想做的,是对它进行单元测试。

我的问题是:

  1. 知道 HttpContextExtensions 没有实现任何接口,我如何为它制作存根/模拟?

  2. 对于 HttpClient?这是最糟糕的,因为它充满了其他地方定义的扩展方法(Post 和类似的方法都是扩展)。

在 2 中。我想我可以坚持“发送”并且它是重载的,但是与 1 中的问题相同

我想做的是为 HttpContextExtensions 和 HttpClient 提取接口,为每个子创建一个子并实现委托给父的接口,然后在我的代码中使用这些接口。

但恕我直言,这是很多工作。

我使用 RhinoMocks 作为我的模拟框架,所以我不能模拟/存根具体类,我想坚持下去,因为我真的认为模拟具体类不是很优雅。

那么,有没有像上面那样对代码进行单元测试的更清洁/更快/更智能的方法?

PD:这是用于 WCF Starter Kit 预览版 2

【问题讨论】:

标签: wcf unit-testing httpclient


【解决方案1】:

如果您真的想模拟该代码,一种适用于这种情况的方法是在 ServiceClient 类中接收一个 HttpClient 实例。 HttpClient 类包含一个处理管道,您可以使用自定义处理程序对其进行自定义。对于您的测试,您基本上可以在该 httpclient 实例中注入一个处理程序,以在最后一个处理程序(传输阶段)中调用真实服务之前向测试返回一个模拟响应。看看这篇文章,了解如何实现这一点,

http://weblogs.asp.net/cibrax/archive/2009/03/18/negotiating-a-saml-token-for-rest-clients-with-httpclient.aspx

问候, 巴勃罗。

【讨论】:

  • 谢谢巴勃罗。我接受了你的建议,但给了它一个更简单的实现,但这只是我所需要的。我在这里weblogs.asp.net/cibrax/archive/2009/03/13/… 关注了您的著作,并制作了自己的 HttpStage 子类,仅用于测试目的,并可配置为返回任何响应。谢谢。
【解决方案2】:

我编写了大部分 HttpClient 代码。 Pablo 的建议是我在单元测试中所做的——请参阅源 zip 中的 FixedTransport.cs。

【讨论】:

  • 我不知道为什么我没有想到去查看套件的来源。明显的!! >_
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
相关资源
最近更新 更多