如何解决如何根据URL
对于Devs, 我将模拟HttpMessageHandler来测试HttpClient,我的问题是如何基于 URL和Http方法?因此,响应将是方法和URL的函数:
Get + "http://testdoc.com/run?test=true&t2=10 => return X
Get + "http://testdoc.com/walk?test=true&t2=10 => return Y
Post + "http://testdoc.com/walk => return Z
所有3个通话都会返回不同的内容。
我当前的单元测试涵盖了所有内容:
var mockMessageHandler = new Mock<HttpMessageHandler>();
mockMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync",ItExpr.IsAny<HttpRequestMessage>(),ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage
{ ... });
谢谢
解决方法
问题是您要告诉moq设置使用任何带有ItExpr.IsAny<HttpRequestMessage>()
的http请求消息,因此对于HttpRequestMessage
的任何实例,它将始终返回相同的结果。
如果您获得X个不同的结果,则需要创建X个不同的实例:
string firstUri = "http://testdoc.com/run?test=true&t2=10";
HttpRequestMessage httpRequestMessage_1 = new HttpRequestMessage
{
RequestUri = new Uri(firstUri),Method = ...,Content = ...,};
ItExpr.IsAny<HttpRequestMessage>()
的实例不是httpRequestMessage_1
,而是:
.Setup<Task<HttpResponseMessage>>("SendAsync",httpRequestMessage_1,ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage
{ /* Something with X */ });
,
根据你的代码,我想出了下面的代码
模拟通过其 URL 识别的两个不同调用。
var mockMessageHandler = new Mock<HttpMessageHandler>();
var content = new HttpContentMock(usersQueryResult);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
mockMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",ItExpr.Is<HttpRequestMessage>(rm =>
rm.RequestUri.AbsoluteUri.StartsWith("https://example.com/api/users?query=")),ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(
new HttpResponseMessage
{
StatusCode = 200,Content = content
};
);
mockMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",ItExpr.Is<HttpRequestMessage>(rm =>
rm.RequestUri.AbsoluteUri.StartsWith("https://example.com/api/users/gurka/")),ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(
new HttpResponseMessage
{
StatusCode = 201,Content = null,// In reality the user found but we don't care for this test.
}
);
}
private class HttpContentMock : HttpContent
{
private readonly IList<AdUserDataContract> users;
public HttpContentMock(IList<AdUserDataContract> users)
{
this.users = users; }
protected override Task SerializeToStreamAsync(Stream stream,TransportContext context)
{
var json = JsonSerializer.Serialize(users,typeof(AdUsersDataContract));
var buffer = Encoding.ASCII.GetBytes(json);
stream.Write(buffer,buffer.Length);
return Task.CompletedTask;
}
protected override bool TryComputeLength(out long length)
{
length = 1; // Well... not totally true is it?
return true;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。