代码之家  ›  专栏  ›  技术社区  ›  Graham Conzett

刚接触asp.NET中的TDD,我的写作测试是否正确?

  •  5
  • Graham Conzett  · 技术社区  · 14 年前

    在过去的几个月里,我读了很多关于TDD的文章,决定跳进去用一个简单的例子来尝试一下,我只是不确定我在实践中是否测试了正确的东西。下面是用于验证电子邮件的自定义数据注释的测试:

    using System;
    using System.Text;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace MembershipTest.Tests
    {
        [TestClass]
        public class CustomDataAnnotationsTest
        {
            [TestMethod]
            public void CustomDataAnnotations_Email_ReturnTrueIfNull()
            {
                // Arrange
                EmailAttribute attribute = new EmailAttribute();
    
                // Act
                bool result = attribute.IsValid(null);
    
                // Assert
                Assert.AreEqual(true, result);
            }
    
            [TestMethod]
            public void CustomDataAnnotations_Email_ReturnFalseIfInvalid()
            {
                // Arrange
                EmailAttribute attribute = new EmailAttribute();
    
                // Act
                bool result = attribute.IsValid("()[]\\;:,<>@example.com");
    
                // Assert
                Assert.AreEqual(false, result);
            }
    
            [TestMethod]
            public void CustomDataAnnotations_Email_ReturnTrueIfValid()
            {
                // Arrange
                EmailAttribute attribute = new EmailAttribute();
    
                // Act
                bool result = attribute.IsValid("john.smith@example.com");
    
                // Assert
                Assert.AreEqual(true, result);
            }
        }
    }
    

    下面是为测试编写的后续代码:

    using System;
    using System.ComponentModel.DataAnnotations;
    using System.Net.Mail;
    
    public class EmailAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            //Let RequiredAttribute validate whether the value is required or not.
            if (value == null)
            {
                return true;
            }
    
            //Check to see if System.Net.Mail can send to the address.
            try
            {
                var i = new MailAddress(value.ToString());
            }
            catch (Exception)
            {
                return false;
            }
    
            return true;
        }
    
    }
    

    1 回复  |  直到 14 年前
        1
  •  6
  •   mpenrow    14 年前

    我认为你走对了方向。在这一点上,我建议在测试中进行一些重构。既然你用的是

    EmailAttribute attribute = new EmailAttribute();
    

    在每次测试中。我建议创建TestInitialize()和TestCleanup()方法。TestInitialize将创建新的EmailAttribute,TestCleanup将使对象无效。这只是偏好的问题。这样地

    private EmailAttribute _attribute;
    
    [TestInitialize]
    public void TestInitialize()
    {
      _attribute = new EmailAttribute
    }
    
    [TestCleanup]
    public void TestCleanup()
    {
      _attribute = null;
    }