c# - 发生异常时如何测试用户是否被重定向到错误页面?
问题描述
我正在尝试编写一个单元测试来测试我的控制器的一个操作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");
}
...
}
}
解决方案
我最终将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);
}
推荐阅读
- python - 来自烧瓶后端的反应前端响应错误
- apache-kafka - Flink processWindow 函数发出带有部分信息的记录
- mongodb - MongoDB:如何不重复收集
- sql - 创建自定义服务器
- ruby-on-rails - ssh 进入实例后 EC2 后端 docker 运行问题
- r - 如何使用 R 中的网页抓取来修复数据读取和表格格式问题
- javascript - 需要帮助从 jquery 更改为 vanilla javascript
- amazon-web-services - 503:使用 Github Probot 的 AWS Lambda 服务不可用
- asp.net - 在 ASP.NET Core 中使用 Cloud Firestore 进行分页
- python - 如何使类在调用时返回属性的值