如何使用RestSharp模拟OWIN Testserver?

时间:2016-05-20 09:14:36

标签: c# unit-testing mocking owin restsharp

我将OWIN与WebAPI集成作为WebApp使用。未来的计划是使用OWIN自托管,它工作正常,但OWIN测试服务器实现不与RestSharp一起使用:

没有RestSharp的示例:

https://blogs.msdn.microsoft.com/webdev/2013/11/26/unit-testing-owin-applications-using-testserver/

首次尝试使用从RestClient类派生的mock类:     公共类MockRestClient:RestClient     {         public TestServer TestServer {get;组; }

    public MockRestClient(TestServer testServer)
    {
        TestServer = testServer;
    }

    public override IRestResponse Execute(IRestRequest request)
    {
        // TODO: Currently the test server is only doing GET requests via RestSharp
        var response = TestServer.HttpClient.GetAsync(request.Resource).Result;
        var restResponse = ConvertToRestResponse(request, response);
        return restResponse;
    }

    private static RestResponse ConvertToRestResponse(IRestRequest request, HttpResponseMessage httpResponse)
    {
        RestResponse restResponse1 = new RestResponse();
        restResponse1.Content = httpResponse.Content.ReadAsStringAsync().Result;
        restResponse1.ContentEncoding = httpResponse.Content.Headers.ContentEncoding.FirstOrDefault();
        restResponse1.ContentLength = (long)httpResponse.Content.Headers.ContentLength;
        restResponse1.ContentType = httpResponse.Content.Headers.ContentType.ToString();
        if (httpResponse.IsSuccessStatusCode == false)
        {
            restResponse1.ErrorException = new HttpRequestException();
            restResponse1.ErrorMessage = httpResponse.Content.ToString();
            restResponse1.ResponseStatus = ResponseStatus.Error;
        }
        restResponse1.RawBytes = httpResponse.Content.ReadAsByteArrayAsync().Result;
        restResponse1.ResponseUri = httpResponse.Headers.Location;
        restResponse1.Server = "http://localhost";
        restResponse1.StatusCode = httpResponse.StatusCode;
        restResponse1.StatusDescription = httpResponse.ReasonPhrase;
        restResponse1.Request = request;
        RestResponse restResponse2 = restResponse1;
        foreach (var httpHeader in httpResponse.Headers)
            restResponse2.Headers.Add(new Parameter()
            {
                Name = httpHeader.Key,
                Value = (object)httpHeader.Value,
                Type = ParameterType.HttpHeader
            });
        //foreach (var httpCookie in httpResponse.Content.)
        //    restResponse2.Cookies.Add(new RestResponseCookie()
        //    {
        //        Comment = httpCookie.Comment,
        //        CommentUri = httpCookie.CommentUri,
        //        Discard = httpCookie.Discard,
        //        Domain = httpCookie.Domain,
        //        Expired = httpCookie.Expired,
        //        Expires = httpCookie.Expires,
        //        HttpOnly = httpCookie.HttpOnly,
        //        Name = httpCookie.Name,
        //        Path = httpCookie.Path,
        //        Port = httpCookie.Port,
        //        Secure = httpCookie.Secure,
        //        TimeStamp = httpCookie.TimeStamp,
        //        Value = httpCookie.Value,
        //        Version = httpCookie.Version
        //    });
        return restResponse2;
    }

不幸的是我坚持使用Post事件,它需要来自restResponse的html body。

有没有人做过类似的事情。

BTW:我也可以在自托管OWIN上使用OWIN单元测试,但这不适用于Teamcity自动构建。

1 个答案:

答案 0 :(得分:1)

我更改了模拟休息客户端以使用Post / Put / Delete方法。它不是100%完整(缺少auth,Cookies,文件等),但在我的情况下它就足够了:

{{1}}