首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TDD -在ASP.NET MVC中测试业务规则/验证

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

Stack Overflow用户
提问于 2010-03-29 18:31:09
回答 1查看 816关注 0票数 3

我使用的是sharp架构,所以我可以很容易地在单元测试和/或TDD中使用mock等。我有相当复杂的业务规则,我想在控制器级别测试它们。我只是想知道其他人是怎么做的?

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

(1)属性级别(例如,需要属性) (2)属性内级别(例如,开始日期<结束日期) (3)持久性级别(例如,名称是唯一的,父项不能是子项的子项)

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

我希望我的问题是有意义的。非常感谢!

谨致问候,

克里斯蒂安

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-30 12:13:39

我通常将其一分为二:

  1. 测试控制器是否在模型有效和无效时正确运行。
  2. 测试模型与规则引擎结合使用时是否生成正确的错误消息。

其基本原理是,当控制器正确地执行错误或错误,并且模型本身验证正确时,应用程序将正确执行。测试设置也会更简单。

在post的最简单情况下,我们可能希望控制器在一切正常时重定向到结果页面,但在存在验证错误时重新显示相同的视图:

代码语言:javascript
运行
复制
  [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();
        }
    }

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

代码语言:javascript
运行
复制
   [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();
        }
    }

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

代码语言:javascript
运行
复制
 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);
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2537208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档