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 { });
我正在尝试测试 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 { });