gpt4 book ai didi

asp.net-mvc - TDD - 在 ASP.NET MVC 中测试业务规则/验证

转载 作者:行者123 更新时间:2023-12-04 19:51:40 25 4
gpt4 key购买 nike

我正在使用 sharp 架构,因此我可以在我的单元测试和/或 TDD 期间轻松使用模拟等。我有相当复杂的业务规则,想在 Controller 级别测试它们。我只是想知道其他人是怎么做到的?

对我来说,验证在三个级别测试业务规则:

(1) 属性级别(例如属性是必需的)(2) 内部属性级别(例如开始日期 < 结束日期)(3) 持久化级别(例如name是唯一的,parent不能是child的child)

我的验证框架还会将错误分配给属性。我只是想知道其他人在做什么?您是否为每个业务规则编写测试并检查是否将正确的错误消息分配给了正确的属性(即查看 ASP.MVC ModelState)?

我希望我的问题是有道理的。非常感谢!

祝愿

基督徒

最佳答案

我通常把它分成两部分:

  1. 测试 Controller 在模型有效和无效时的行为是否正确。
  2. 测试模型与规则引擎的结合是否会产生正确的错误消息。

基本原理是,当 Controller 针对错误或不正确表现时,并且模型本身正确验证时,应用程序将表现正确。测试设置也将更简单。

在最简单的情况下,我们可能希望 Controller 在一切正常时重定向到结果页面,但在出现验证错误时重新显示相同的 View :

  [TestClass]
public class Maintaining_todo_list
{
private TodoController controller;

[TestInitialize]
public void Setup()
{
controller = new TodoController {ControllerContext = new ControllerContext()};
}

[TestMethod]
public void Valid_update_should_redirect_to_list()
{
var result = controller.Edit(1, new TodoItem {Text = "todo"});
result.ShouldRedirectTo("list");
}

[TestMethod]
public void Invalid_update_should_display_same_view()
{
var result = controller.Edit(1, new TodoItem {Text = ""});
result.ShouldDisplayDefaultView();
}
}

模型可能会以各种方式失败并显示不同的消息:

   [TestClass]
public class Validating_todo_item
{
[TestMethod]
public void Text_cannot_be_empty()
{
var todo = new TodoItem {Text = ""};
todo.ShouldContainValidationMessage("Text cannot be empty");
}

[TestMethod]
public void Text_cannot_contain_more_than_50_characters()
{
var todo = new TodoItem { Text = new string('a', 51) };
todo.ShouldContainValidationMessage("Text cannot contain more than 50 characters");
}

[TestMethod]
public void Valid_items()
{
new TodoItem { Text = new string('a', 1) }.ShouldBeValid();
new TodoItem { Text = new string('a', 50) }.ShouldBeValid();
}
}

(为了完整起见,这里是测试助手)

 internal static class AssertionHelpers
{
public static void ShouldRedirectTo(this ActionResult result, string action)
{
var redirect = result as RedirectToRouteResult;

Assert.IsNotNull(redirect);
Assert.AreEqual(action, redirect.RouteValues["action"]);
Assert.IsNull(redirect.RouteValues["controller"]);
}

public static void ShouldDisplayDefaultView(this ActionResult result)
{
var view = result as ViewResult;

Assert.IsNotNull(view);
Assert.AreEqual("", view.ViewName);
}

public static void ShouldContainValidationMessage(this TodoItem todo, string message)
{
var context = new ValidationContext(todo, null, null);
var results = new List<ValidationResult>();

Validator.TryValidateObject(todo, context, results, true);

var errors = results.Select(result => result.ErrorMessage);

foreach (var error in errors)
{
Console.Out.WriteLine(error);
}

Assert.IsTrue(errors.Contains(message));
}

public static void ShouldBeValid(this TodoItem todo)
{
var context = new ValidationContext(todo, null, null);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(todo, context, results, true);
Assert.IsTrue(isValid);
}
}

关于asp.net-mvc - TDD - 在 ASP.NET MVC 中测试业务规则/验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2537208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com