在asp.NET中使用TDD,我写测试的方式正确吗?

11 浏览
0 Comments

在asp.NET中使用TDD,我写测试的方式正确吗?

最近几个月,我一直在阅读关于TDD(测试驱动开发)的内容,并决定尝试一个简单的例子来实践。但我不确定我的测试是否针对正确的事物。以下是用于验证电子邮件的自定义数据注释的测试:\n

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()
        {
            EmailAttribute attribute = new EmailAttribute();
            bool result = attribute.IsValid(null);
            Assert.AreEqual(true, result);
        }
        [TestMethod]
        public void CustomDataAnnotations_Email_ReturnFalseIfInvalid()
        {
            EmailAttribute attribute = new EmailAttribute();
            bool result = attribute.IsValid("()[]\\;:,<>@example.com");
            Assert.AreEqual(false, result);
        }
        [TestMethod]
        public void CustomDataAnnotations_Email_ReturnTrueIfValid()
        {
            EmailAttribute attribute = new EmailAttribute();
            bool result = attribute.IsValid("john.smith@example.com");
            Assert.AreEqual(true, result);
        }
    }
}

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

using System;
using System.ComponentModel.DataAnnotations;
using System.Net.Mail;
public class EmailAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return true;
        }
        try
        {
            var i = new MailAddress(value.ToString());
        }
        catch (Exception)
        {
            return false;
        }
        return true;
    }
}

\n初始时所有测试都失败了,但在编写代码后成功了。但这些测试是否适当?是太多还是太少?我知道这只是一个非常简单的例子,但在继续处理更复杂的内容之前,我想确保我走在正确的轨道上。

0
0 Comments

我认为你的方法是正确的。在这一点上,我建议对你的测试进行一些重构。由于你在每个测试中都使用了EmailAttribute attribute = new EmailAttribute();,我建议创建TestInitialize()和TestCleanup()方法。TestInitialize方法会创建新的EmailAttribute对象,而TestCleanup方法会将对象设置为null。这只是个人偏好的问题。像这样:

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

你的观点非常有道理,使用SetUp/TearDown确实是一个很好的做法 🙂

你的观点非常有道理,但是使用Visual Studio单元测试工具时,我认为这些属性应该分别是TestInitializeTestCleanup(你使用的是NUnit的属性):D

谢谢Cocowalla。我已经更改了属性名称。

0