2016-09-20 14 views
1

Я пытаюсь выполнить тестирование тестирующего контроллера, который ловит FlurlHttpException и вызывает GetResponseJson<TError>(), чтобы получить сообщение об ошибке в блоке catch. Я попытался высмеять исключение, но свойство Call не позволяет мне установить Settings. Когда тестирование устройства выполняется сбой, потому что в настройках нет JsonSerializer. Как настроить этот тест?Модуль тестирования модуля с использованием Flurl GetResponseJson <TError>()

Вот моя текущая попытка, что не работает:

Контроллер

[Route] 
public async Task<IHttpActionResult> Post(SomeModel model) 
{ 
    try 
    { 
     var id = await _serviceClient.Create(model); 

     return Ok(new { id }); 
    } 
    catch (FlurlHttpException ex) 
    { 
     if (ex.Call.HttpStatus == HttpStatusCode.BadRequest) 
      return BadRequest(ex.GetResponseJson<BadRequestError>().Message); 
     throw; 
    } 
} 

Unit Test

[TestMethod] 
public async Task Post_ServiceClientBadRequest_ShouldReturnBadRequestWithMessage() 
{ 
    //Arrange 
    string errorMessage = "A bad request"; 
    string jsonErrorResponse = JsonConvert.SerializeObject(new BadRequestError { Message = errorMessage }); 
    var badRequestCall = new HttpCall 
    { 
     Response = new HttpResponseMessage(HttpStatusCode.BadRequest), 
     ErrorResponseBody = jsonErrorResponse 
     //This would work, but Settings has a private set, so I can't 
     //,Settings = new FlurlHttpSettings { JsonSerializer = new NewtonsoftJsonSerializer(new JsonSerializerSettings()) } 
    }; 

    _mockServiceClient 
     .Setup(client => client.create(It.IsAny<SomeModel>())) 
     .ThrowsAsync(new FlurlHttpException(badRequestCall, "exception", new Exception())); 

    //Act 
    var result = await _controller.Post(new SomeModel()); 
    var response = result as BadRequestErrorMessageResult; 

    //Assert 
    Assert.IsNotNull(response); 
    Assert.AreEqual(errorMessage, response.Message); 
} 
+0

Я думаю '.ReturnsAsync (() => thow new FlurlHttpException (badRequestCall," exception ", new Exception()))' – Nkosi

+0

'ThrowsAsync' работает правильно. Это просто создание того, что 'FlurlHttpException' вручную не позволяет мне заполнять свойство' Settings', что вызывает ошибку. – DerekMT12

+0

О, хорошо, я неправильно понял. продолжит поиск – Nkosi

ответ

2

Если вы герметизирующего использование Flurl в пределах вашего объекта ServiceClient , то я думаю, поймав FlurlException, извлекая Message и retur в этом сервисе также должно быть инкапсулировано более подходящее исключение. Это упростит проверку вашего контроллера.

+0

Это очень хороший момент. Я сделаю это. Благодаря! – DerekMT12

 Смежные вопросы

  • Нет связанных вопросов^_^