WebApi 最小起订量。被测方法中的字段未初始化

WebApi Moq. Field in method under test not initialized

我正在尝试测试 WebApi post 方法。但我对测试失败的原因完全感到困惑 - 看起来 class 构造函数尚未初始化。
这是正在测试的方法:

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

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

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