Ok结果的单元测试测试

时间:2017-01-18 11:48:13

标签: c# unit-testing httpresponse

我有以下(简化)控制器:

public async Task<IHttpActionResult> Profile(UpdateProfileModelAllowNulls modelNullable)
{         
    ServiceResult<ProfileModelDto> result = await _profileService.UpdateProfile(1);

    return Ok(result);         
}

public async Task<ServiceResult<ProfileModelDto>> UpdateProfile(ApplicationUserDto user, UpdateProfileModel profile)
{
     //Do something...
}

以及以下NUnit测试:

[Test]
        public async Task Post_Profile()
        {
            var result = _controller.Profile(new UpdateProfileModelAllowNulls() { Email = "testEmail@tt.co.uk", DisplayName = "TestDisplay"}) as OkNegotiatedContentResult<Task<<ProfileModelDto>>;
            Assert.IsNotNull(result);            
        }

在我的NUnit测试中,我正在尝试使用本教程https://www.asp.net/web-api/overview/testing-and-debugging/unit-testing-with-aspnet-web-api检查确定结果。

我的问题是我无法转换为OkNegotiatedContentResult,我假设因为我没有传递正确的对象,但是我看不出应该传入的对象。据我所知,我传递正确的对象,例如:OkNegotiatedContentResult<Task<<ProfileModelDto>>;

但这不起作用。

我也尝试过:

var result = _controller.Profile(new UpdateProfileModelAllowNulls() { Email = "testEmail@tt.co.uk", DisplayName = "TestDisplay"}) as OkNegotiatedContentResult<Task<IHttpActionResult>>;

但这也不起作用。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

您的控制器是Async,因此您应该将其称为:

var result = (_controller.Profile(new UpdateProfileModelAllowNulls() { Email = "testEmail@tt.co.uk", DisplayName = "TestDisplay"}).GetAwaiter().GetResult()) as OkNegotiatedContentResult<ProfileModelDto>;

答案 1 :(得分:1)

如@esiprogrammer所述,该方法是异步的,所以我需要添加awaiter。

我能够通过执行以下操作来修复它:

    var result = _controller.Profile(new UpdateProfileModelAllowNulls() { Email = "testEmail@wwasoc.co.uk", DisplayName = "TestDisplay"});
    var okResult = await result as OkNegotiatedContentResult<ServiceResult<ProfileModelDto>>;

我已经接受了@esiprogrammer的答案,因为他正确地回答了这个问题,而且还在我之前