代码之家  ›  专栏  ›  技术社区  ›  David Lay

如何对使用WCF Rest初学者工具包构建的WCF客户端进行单元测试

  •  2
  • David Lay  · 技术社区  · 17 年前

    我使用REST初学者工具包创建了一些POX服务。

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

    因此,我有一个示例方法,它使用datacontract和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。我想我可以坚持使用'Send'并且它是重载的,但是这和1中的问题是一样的

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

    但这是我的很多工作。

    那么,有没有一种更干净/更快/更智能的方法来对上述代码进行单元测试?

    PD:这是用于WCF初学者工具包预览2

    2 回复  |  直到 17 年前
        1
  •  2
  •   Pablo Cibraro    17 年前

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

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

    当做 巴勃罗。

        2
  •  2
  •   JLamb    17 年前