2016-12-15 9 views
1

В общем, все мои тесты хорошо работают, за исключением тех, которые проверяют POST-запрос. Его всегда возвращает BadRequest. Я не знаю, что именно не так, потому что, как-то, это не уровни увольнения ниже (например, уровень сервиса и уровень данных).
Вот метод испытания:
Каков правильный способ для модульного тестирования запроса WebApi POST?

[TestMethod] 
     public async Task AddTourObject() 
     { 
      // Упорядочение 
      var mockService = new Mock<ITourObjectService>(MockBehavior.Default); 
      var viewmodel = new TourObjectViewModel 
      { 
       TypeId = 10, 
       Name = "Деревья гнулись", 
       Address = "f yjxr", 
       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(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer { }); 
      var controller = new TourObjectController(mockService.Object); 
      // Действие 
      var result = await controller.Post(viewmodel); 
      // Утверждение 
      Assert.IsNotNull(result); 
      Assert.IsInstanceOfType(result, typeof(OkNegotiatedContentResult<string>)); 
      Assert.IsTrue(result.ToString().Contains("успешно")); 
     } 

И метод под тест:

public async Task<IHttpActionResult> Post(TourObjectViewModel viewmodel) 
     { 
      var answer = new ActionAnswer(); 
      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); 
       return answer.IsSuccess == false ? (IHttpActionResult) BadRequest(answer.ToString()) : Ok(answer.ToString()); 
      } 
      catch (Exception ex) 
      { 
       Log.ErrorFormat("Method:{0} <br/> Error: {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, ex); 
       return BadRequest(answer.ToString());    
      } 
     } 
  1. Могу ли я установить этот тест правильно?
  2. Это то, что я должен проверить?
+0

Как будет ActionAnswer {} инициализировать IsSuccess? Я бы ожидал, что 'false' означает, что контроллер возвращает' BadRequest' – Johnny

+0

@Lepijohnny, обычно метод на уровне ниже (Service Layer), возвращает метод ActionAnswer и устанавливает значение IsSuccess enum как false или true. –

+0

@ Лепихойный, наверное, я не понимаю, как работает Мок. Раньше я предполагал, что он запускает полный цикл - WebApi> Сервис> DataAccessLayer. –

ответ

1

Проблема с вашей настройкой здесь. При настройке службы возвращается пустой ActionAnswer для каждого предоставленного ввода.

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

Это означает, что когда-либо предоставляется сервис просто возвращает пустой объект. Идея макета состоит в том, чтобы попытаться моделировать различное поведение и разные пути в вашей программе. Таким образом, вы можете, например, теста следующие сценарии:

1), что если служба возвращает ActionAnswer с IsSuccess == ложный mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer{ IsSuccess = false })

2), что если служба возвращает ActionAnswer с IsSuccess == истинный mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer{ IsSuccess = true })

Там это множество путей, которые вы можете выбрать, но идея состоит в том, чтобы найти критические пути и проверить их.