Как проверить, перенаправляется ли пользователь на страницу ошибки при возникновении исключения? - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь написать модульный тест для проверки одного из действий моего контроллера ShareWorkbook. Тест должен проверить, отправляется ли пользователь на общую страницу ошибки (определенную в Startup.cs), если исключение происходит в вышеуказанном действии. Однако, на данный момент, но мои модульные тесты не пройдены из-за моего жестко закодированного исключения. Я знаю, что мой тест проверяет, что пользователь перенаправлен на страницу ошибки, но это исключение нарушает модульный тест (см. Исключение ниже). Есть ли способ обойти это, чтобы исключение было проигнорировано и тест прошел?

Это мой HomeController с действием, которое я пытаюсь проверить:

public class HomeController : Controller
{
...

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult ShareWorkbook(string emails, string title, string workbookId)
    {
        var emailStrArr = Regex.Split(emails, Constants.SplitPattern).ToList();

        var workbookShareModel = new WorkbookShareModel
        {
            WorkbookId = workbookId,
            Title = title,
            Emails = emailStrArr
        };

        // check to see if the 'WorkbookShareModel' is valid (takes into account its property DataAnnotation)
        if (TryValidateModel(workbookShareModel))
        {
            try
            {
                ShareWorkbook(workbookShareModel);
            }
            catch (Exception e)
            {
                _logger.LogException(e, e.Message);
                throw;
            }
        }

        // return no content to avoid page refresh
        return NoContent();
    }

    private void ShareWorkbook(WorkbookShareModel workbookShareModel)
    {
       // MOCK SERVICE
        _workbookManagementService.ShareWorkbook(workbookShareModel);
    }
}

В настоящее время у меня есть жестко закодированное исключение, которое я добавил в свой MockService:

public class MockManagementService : IManagementService
{
    public void ShareWorkbook(WorkbookShareModel sharedWorkbook)
    {
        if (string.IsNullOrEmpty(sharedWorkbook.WorkbookId))
            throw new Exception("Couldn't share workbook");
    }
}

Это исключение, которое я получаю (ожидается):

System.Exception : Couldn't share workbook
   at Project.Test.Services.MockManagementService.ShareWorkbook(WorkbookShareModel sharedWorkbook) in D:\_JustCodeHere\Apps\ProjectCore\ProjectCore.Test\Services\MockManagementService.cs:line 27

Это мой юнит-тест:

public class HomeControllerTest
{
    [Fact]
    public void error_page_is_shown_if_exception_occurs_during_workbook_sharing_process()
    {
        // Arrange
        var workbookService = new MockManagementService();
        var mockLogger = new Mock<ILogger>();
        var controller = new HomeController(null, null, workbookService, mockLogger.Object);
        controller.ObjectValidator = new TestingObjectValidator();

        // Act
        // passing 'null' for the workbookId parameter raises an exception
        var result = controller.ShareWorkbook("test@email.com", "workbook title", null);

        // Assert
        var redirectToActionResult = Assert.IsType<RedirectToActionResult>(result);
        Assert.Equal("Error", redirectToActionResult.ActionName);
    }
}

Вот как я настроил страницу ошибки:

public class Startup
{
    ...
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    ...
    }
}

1 Ответ

0 голосов
/ 22 мая 2019

Я закончил заменой вызова throw; в действии моего контроллера на return RedirectToAction("Error");.Это позволяет мне выполнить модульное тестирование того, что пользователь перенаправляется на нужную страницу следующим образом:

public void error_page_is_shown_if_exception_occurs_during_workbook_sharing_process()
{
    // Arrange
    var emails = "test@email.com";
    var title = "";

    // Act
    // passing 'null' for the workbookId parameter raises an exception
    var result = _controller.ShareWorkbook(emails, title, null);

    // Assert
    var redirectToActionResult = Assert.IsType<RedirectToActionResult>(result);
    Assert.Equal("Error", redirectToActionResult.ActionName);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...