【问题标题】:Unit Testing for VS2017 projectVS2017项目的单元测试
【发布时间】:2019-04-14 23:45:17
【问题描述】:

我在 VS2017 中有一个 ASP.NET 应用程序(我捕获一些输入的基本形式)。

表单上的一个字段是 Mark,它是一个整数。

我的 .cs 文件中有以下标记代码块。

    [Display(Name = "Mark")]
    [Range(1, 10, ErrorMessage = "Mark must be between 1 and 10")]                              
    public int Mark{ get; set; }

我为此应用程序创建了一个 MSTest 项目来编写单元测试。

我的问题是,您是否为此块编写测试用例以验证输入值是否在预期范围内?

如果是,你是怎么写的?

我已经开始这样做了。

    [DataRow(0, "Mark must be between 1 and 10")]
    [DataRow(11, "Mark must be between 1 and 10")]
    [DataTestMethod]
    public void TestMark_IsMarkValid_NotValid(int mark, string expectedMsg)
    {
        //Arrange
        Student testStudent = new Student();
        testStudent.Mark = mark; //this does not throw any error, although the assigned value is outside of the defined range. But it looks like the range validation only applies to the webform.

        //Act

        string actualMsg = "Mark must be between 1 and 10"; //this is not correct. I was thinking to capture in the actual result the error message yield by the Range validation, but assigning a value outside range doesn't yield any error message. 

        //Assert
        Assert.AreEqual(expectedMsg, actualMsg);
    }

现在,不确定该块是否应该在单元测试的范围内。如果应该是,我感觉我采取的方法是不正确的。

有什么想法吗?

非常感谢, 科斯敏

【问题讨论】:

    标签: c# visual-studio unit-testing visual-studio-2017 mstest


    【解决方案1】:

    有趣的问题。我不确定是否有明确的正确答案。但这是我的想法:

    1) “标记”是一个属性。我们不需要对属性进行单元测试,因为 Microsoft 已经测试过该属性是否有效。

    2) 属性不影响属性,但提供其他人可以使用的属性信息。这就是为什么您的单元测试通过了该值的测试。表单使用属性,您的单元测试不使用。这就是为什么您的单元测试可以分配任何值。

    3) 如果您真的想限制变量的值,那么将其限制在 Student 类中 - 通过设置器或显式 get/set 和支持变量 - 您永远不能信任浏览器提交的任何数据。

    4) 测试 UI 并不容易。我们有一个手动测试的测试团队。我们尝试了几种工具,但没有一个是出色的。将您的业务逻辑放在 UI 之外,并将其放在可以轻松测试的业务类中。

    所以,为了回答你的问题,我个人不会在单元测试中测试属性功能。

    希望对你有帮助。

    【讨论】:

    • 非常好的观点。我同意 UI 和业务逻辑应该分开。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多