2016-12-12 2 views
1

Я пытаюсь проверить метод публикации WebApi. Но я полностью путаюсь с причиной неудачного теста - похоже, что конструктор классов не был инициализирован.
Вот метод испытываемого:
WebApi Moq. Поле в методе тестирования не инициализировано

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>)); 
} 

испытания не удалось с ЯРД:

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

+1

Опубликовать сообщение об ошибке, по которому тест не прошел. – Stormhashe

+0

@Nkosi, _tos - это служба, вводимая в контроллер, добавление сигнатуры метода: public async Задача Добавить (TourObjectDTO dto) –

+0

@ andrey.shedko В конце концов я понял это после перечитывания вашего сообщения. поэтому почему я удалил свой комментарий. проверить мой ответ – Nkosi

ответ

0

Установка Add ожидает конкретный объект, но вы строите новый объект в метод под тестированием. если целью является только возвращение a ActionAnswer на добавление, тогда попробуйте

mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer { }); 
Смежные вопросы