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

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

所以,我有这个示例方法,通过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");
        }
    }
}

这种方法很有效,确实可以正确发布数据和序列化。

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

我的问题是:

  1. 如何知道HttpContextExtensions没有实现任何接口,为HttpContextExtensions创建存根/模拟?

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

  3. 在2.我想我可以坚持'发送'并且它是重载,但那时与1中的问题相同

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

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

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

    那么,是否有更清洁/更快/更智能的单元测试代码,如上所述?

    PD:这适用于WCF入门套件预览2

有帮助吗?

解决方案

如果您真的想要模拟该代码,那么可以适用于此场景的方法是在ServiceClient类中接收HttpClient实例。 HttpClient类包含一个可以使用自定义处理程序自定义的处理管道。对于您的测试,您基本上可以在该httpclient实例中注入一个处理程序,以便在最后一个处理程序(Transport Stage)中调用实际服务之前返回对该测试的模拟响应。看看这篇文章,了解如何实现这一点,

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

此致 巴勃罗。

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top