XUnit: Как установить исключение, выданное контроллером в ASP. NET Core - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть метод внутри контроллера, который делает некоторые проверки, когда проверка не соответствует действительности, он выдаст ошибку. Как я поймаю эту ошибку, выданную API, с указанием сообщения c?

Я не совсем понимаю, как делать такие типы утверждений.

Пока это мой код, но мне не удалось отловить ошибку, выданную контроллером. Что я делаю не так?

[Fact]
    public async Task AppendEmailBase64Dto_InvalidBase64_ReturnBadRequest()
    {
        // Arrange
        var emailControllerMocks = new EmailControllerMocks();
        var mockLogger = emailControllerMocks.MockLogger();
        var mockMapper = emailControllerMocks.MockMapper();
        var mockEmsWorkUnit = emailControllerMocks.MockEmsWorkUnit();
        var mockAzureBlob = emailControllerMocks.MockAzureBlobAndGetTemplate();

        // Setup
        var userRequestTemplateString = File.ReadAllText(@".\EmailController\UserRequestTemplate.txt");
        mockAzureBlob.Setup(blob => blob.GetHtmlBlob(It.IsAny<string>(), It.IsAny<Uri>()))
            .ReturnsAsync(userRequestTemplateString);


        // Act
        var emailController = new Controllers.ApiV10.EmailController(mockLogger.Object, mockMapper.Object, mockEmsWorkUnit.Object, mockAzureBlob.Object);
        var jsonString = File.ReadAllText(@".\EmailController\TemplateBase64Invalid.json");
        var testEmailBase64Dto = GeneralHelpers.Deserialize<EmailBase64Dto>(jsonString);

        var badRequestResult = await emailController.AppendEmailBase64Dto(testEmailBase64Dto);
        //var result = badRequestResult.Value as ObjectResult;
        //var errorMessage = badRequestResult.Value as List<string>;
        //var statusCode = badRequestResult.StatusCode;

        // Assert
        //Assert.Equal("The provided base64 template is not a valid base64 string", errorMessage[0]);
        //Assert.Equal(400, statusCode);
    }

1 Ответ

1 голос
/ 05 апреля 2020

Используйте Assert.ThrowsAsyn c (асинхронный аналог Assert.Throws ), чтобы утверждать, что генерируется исключение определенного типа.

В В вашем случае вы захотите что-то вроде:

var ex = Assert.Throws<HttpException>(() => await emailController.AppendEmailBase64Dto(testEmailBase64Dto);

Очевидно, установите HttpException для любого типа исключения, которое вы ожидаете. Вы не сможете проверить тип возвращаемого значения в том же тесте (потому что AppendEmailBase64Dto не будет возвращаться при возникновении исключения), поэтому вам нужно будет написать исключение в отдельном тесте. Возможно, вы захотите извлечь свой установочный код и поделиться им между этими тестами.

...