【发布时间】:2013-06-21 10:51:41
【问题描述】:
我正在尝试测试一种发出两个连续 Web 请求的方法。
到目前为止,我只使用 this solution using an object called TestWebRequest 测试了单个请求,这对于单个请求来说就像一个魅力。如果您不熟悉它,TestWebRequest 会拦截 Web 请求机制并在幕后工作以返回预期的响应。这样就可以在不使用模拟的情况下测试实际服务。
但是现在我的一个方法的逻辑已经变成了这样的东西(在伪代码中)
public void MakePayment(PaymentRequest request)
{
var statusRequest = webService.GetPaymentStatus(new PaymentStatusRequest()
{
OrderId = request.OrderId
});
if (statusRequest.StatusId != 100)
{
var responseXml = webService.GetResponse(GetRequestXml(request));
/*.. process response ..*/
}
}
有没有办法扩展TestWebRequest 来处理两个请求,或者我可以使用替代方法来测试这个方法?
这是一个工作测试的例子:
[Test]
public void MakePayment()
{
var response = @"<XML>..</XML>";
TestWebRequest request = TestWebRequestCreate.CreateTestRequest(response);
var result = webService.MakePayment(1, new PaymentRequest());
var expectedResponse = new PaymentResponse()
{
Status = 23
};
Assert.AreEqual(expectedResponse, result);
}
现在如果 MakePayment 突然发出两个请求,那么我们需要一种方法来模拟两个假响应,如下所示:
[Test]
public void MakePayment()
{
var response1 = @"<XML>..</XML>";
var response2 = @"<XML>..</XML>";
TestWebRequest request1 = TestWebRequestCreate.CreateTestRequest(response1);
TestWebRequest request2= TestWebRequestCreate.CreateTestRequest(response2);
var result = webService.MakePayment(1, new PaymentRequest());
var expectedResponse = new PaymentResponse()
{
Status = 23
};
Assert.AreEqual(expectedResponse, result);
}
这不起作用。
提前致谢
【问题讨论】:
-
您能发布您要测试的实际代码而不是伪代码吗?我有一个答案给你,但我不得不做出太多假设,因为我在猜测你实际上在测试什么
-
我刚刚发布了实际代码。我只是在同一个方法中发出两个 Web 请求。如果我做一个,那么测试通过,但如果我做两个,那么 TestWebRequest 返回相同的响应。我不能让它以特定的顺序返回两个不同的响应
标签: asp.net-mvc-3 unit-testing c#-4.0 httpwebrequest moq