如何用一次性物体对其进行单元测试

时间:2017-05-22 11:07:37

标签: c# .net unit-testing testing asp.net-web-api

我正在对我的控制器进行单元测试,看起来像这样:

[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来做到这一点。

1 个答案:

答案 0 :(得分:1)

响应消息包含在using语句中,一旦方法超出范围,它将调用dispose。删除using语句

public override IHttpActionResult CreditCustomer() {
    //...

    var response = new HttpResponseMessage();
    //...
    return this.ResponseMessage(response);

}

您正在尝试管理您无法控制的代码。响应的处理由框架管理。在这种情况下,无需管理HttpResponseMessage,因为框架将在流程完成后处理它。

通过尝试自己处理它,你破坏了框架(你无法控制)。框架期望获得有效的响应消息并使用它。