Я пытаюсь написать модульный тест для проверки одного из действий моего контроллера 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");
}
...
}
}