在asp.NET中使用TDD,我写测试的方式正确吗?
在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初始时所有测试都失败了,但在编写代码后成功了。但这些测试是否适当?是太多还是太少?我知道这只是一个非常简单的例子,但在继续处理更复杂的内容之前,我想确保我走在正确的轨道上。
我认为你的方法是正确的。在这一点上,我建议对你的测试进行一些重构。由于你在每个测试中都使用了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单元测试工具时,我认为这些属性应该分别是TestInitialize
和TestCleanup
(你使用的是NUnit的属性):D
谢谢Cocowalla。我已经更改了属性名称。