我正在对我的控制器进行单元测试,看起来像这样:
[Test]
public void Test()
{
//Arrange
var dummySeamlessCustomerRequest = CustomerControllerTestsHelper.CreateDummyCustomerRequest();
var dummySeamlessCustomerResponse = CustomerControllerTestsHelper.CreateDummyCustomerResponse();
_mockSeamlessService.Setup(s => s.GetSeamlessCustomerCallRequest(_controller.Request, "Credit Customer"))
.Returns(new ModuleResultSet<SeamlessCustomerRequest>(HttpStatusCode.OK, null, dummySeamlessCustomerRequest));
_mockAdapter.Setup(a => a.SendCreditCustomerCallToProvider(dummySeamlessCustomerRequest))
.Returns(dummySeamlessCustomerResponse);
//Act
var actionResult = _controller.CreditCustomer();
var expectedResponse = actionResult as ResponseMessageResult;
//Assert
Assert.IsNotNull(expectedResponse);
Assert.AreEqual(CustomerControllerTestsHelper.CreateSeamlessCustomerResponseString(dummySeamlessCustomerResponse),
expectedResponse.Response.Content.ReadAsStringAsync().Result);
}
我的测试目标方法如下:
public override IHttpActionResult CreditCustomer()
{
//...
using (var response = new HttpResponseMessage())
{
//...
return this.ResponseMessage(response);
}
}
我把方法中最重要的部分留给了我(如果你认为我应该多告诉我,但是我只有一些服务电话可以轻松地在我的测试中模拟。 问题是,当我运行测试时,我收到以下错误:
测试名称:测试 测试FullName:ETIAdapter.Tests.Controllers.CustomerControllerTests.Test 测试结果:失败 测试时间:0:00:00.005
结果StackTrace:
在System.Net.Http.HttpContent.CheckDisposed() 在System.Net.Http.HttpContent.ReadAsStringAsync() 在ETIAdapter.Tests.Controllers.CustomerControllerTests.Test()在D:\ Repositories \ test_seamless-service \ seamless-service \ src \ ETIAdapter.Tests \ Controllers \ CustomerControllerTests.cs:第79行 结果消息:System.ObjectDisposedException:无法访问已处置的对象。 对象名:'System.Net.Http.StringContent'。
我试图搜索测试此类方法的解决方案,但我找不到它。大多数问题都是关于实现IDisposable
的自定义对象,因此他们正在嘲笑它们,但我不能用HttpResponseMessage
来做到这一点。
答案 0 :(得分:1)
响应消息包含在using语句中,一旦方法超出范围,它将调用dispose。删除using语句
public override IHttpActionResult CreditCustomer() {
//...
var response = new HttpResponseMessage();
//...
return this.ResponseMessage(response);
}
您正在尝试管理您无法控制的代码。响应的处理由框架管理。在这种情况下,无需管理HttpResponseMessage
,因为框架将在流程完成后处理它。
通过尝试自己处理它,你破坏了框架(你无法控制)。框架期望获得有效的响应消息并使用它。