WebApi Moq。未初始化的测试方法中的字段

时间:2016-12-12 13:08:52

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

我正在尝试测试WebApi post方法。但是我完全混淆了测试失败的原因 - 看起来像类构造函数还没有被初始化 这是测试方法:

public async Task<IHttpActionResult> Post(TourObjectViewModel viewmodel)
{
    var answer = new ActionAnswer(); \\this variable is null
    try
    {
        var dto = new TourObjectDTO
        {
            TypeId = viewmodel.TypeId,
            Name = viewmodel.Name,
            Address = viewmodel.Address,
            Latitude = viewmodel.Latitude,
            Longitude = viewmodel.Longitude,
            CountryId = viewmodel.CountryId,
            RegionId = viewmodel.RegionId,
            CityId = viewmodel.CityId.Value,
            Rating = viewmodel.Rating,
            InternalRating = viewmodel.InternalRating,
            CheckInTime = viewmodel.CheckInTime,
            CheckOutTime = viewmodel.CheckOutTime,
            HowToGet = viewmodel.HowToGet,
            Web = viewmodel.Web,
            Email = viewmodel.Email
        };
        answer = await _tos.Add(dto);
    }
    catch (Exception ex)
    {
        Log.ErrorFormat("Method:{0} <br/> Error: {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
        return BadRequest(answer.ToString());              
    }
    return  Ok(answer.ToString());
}

这是测试方法:

[TestMethod]
public async Task AddTourObject()
{
    // Упорядочение
    var mockService = new Mock<ITourObjectService>(MockBehavior.Default);
    var dto = new TourObjectDTO()
    {
        TypeId = 10,
        Name = "fgasdfsdfasdf",
        Address = "fgasdfsdfasdf",
        Latitude = 120.22,
        Longitude = 220.34,
        CountryId = 1,
        RegionId = 2,
        CityId = 1,
        Rating = 2,
        InternalRating = 2,
        CheckInTime = "12:00",
        CheckOutTime = "12:00",
        HowToGet = "sss",
        Web = "web",
        Email = ""
    };
    var viewmodel = new TourObjectViewModel
    {
        TypeId = 10,
        Name = "fgasdfsdfasdf",
        Address = "fgasdfsdfasdf",
        Latitude = 120.22,
        Longitude = 220.34,
        CountryId = 1,
        RegionId = 2,
        CityId = 1,
        Rating = 2,
        InternalRating = 2,
        CheckInTime = "12:00",
        CheckOutTime = "12:00",
        HowToGet = "sss",
        Web = "web",
        Email = ""
    };
    mockService.Setup(x => x.Add(dto)).ReturnsAsync(new ActionAnswer { });
    var controller = new TourObjectController(mockService.Object);
    // Действие
    var result = await controller.Post(viewmodel);
    // Утверждение
    Assert.IsNotNull(result);
    Assert.IsInstanceOfType(result, typeof(OkNegotiatedContentResult<ActionAnswer>));
}

NRE测试失败:

  

System.NullReferenceException:Ссылканаобъектнеуказываетна   экземпляробъекта..           вCamps.Api.Controllers.TourObjectController。<Post> d__5.MoveNext()в   D:\ Dev \ Camps \ Camps.Api \ Controllers \ TourObjectController.cs:строка147

1 个答案:

答案 0 :(得分:0)

添加设置需要特定的对象,但您正在测试的方法中构建一个新对象。如果目标只是在添加时返回ActionAnswer,请尝试

mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer { });