VS2017项目的单元测试

时间:2018-11-12 09:18:23

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

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

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

在我的.cs文件中,我有以下用于Mark的代码块。

    [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);
    }

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

有什么想法吗?

非常感谢, 波斯菊

1 个答案:

答案 0 :(得分:2)

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

1)“标记”是一个属性。我们不需要对属性进行单元测试,因为Microsoft已经测试了该属性可以工作。

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

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

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

因此,为回答您的问题,我个人不会在单元测试中测试该属性是否起作用。

我希望有帮助。