我已将功能添加到帐户控制器 - >注册操作ValidateRegistation功能,以测试用户注册表单中的空白 . 我现在想要在用户输入的电子邮件地址已经在系统中时向表单抛出错误 . 我在ValidateRegistration函数的末尾添加了重复电子邮件地址的功能检查 .
我使用linq查询数据库以创建用户列表,并检查电子邮件是否已被使用,这在运行时运行良好 . 我已经创建了一个可视化基础测试,在注册操作期间测试用户对象(用户名,密码等)以查找重复的电子邮件地址 . 如何避免ValidateRegistration查询数据库并创建用户列表(这是我在运行时期间想要的),而是在单元测试期间使用假用户对象提供ValidateRegistration?
示例代码:Accounts Contoller
public ActionResult Register(string username... string password...)
{
//Call the ValidateRegistration(string username... string password...);
//Add user if ValidateRegistration checks have passed
}
public ValidateRegistration(string username ... string password ...){//检查用户名是否为空// ModelState.AddModelError(用户名为空)
//检查密码长度// ModelState.AddModelError(密码太短消息)
// List lstUsers = GetUsers(); //检查是否已使用电子邮件地址// ModelState.AddModelError(已使用的电子邮件)
//如何对上述电子邮件地址进行单元测试?
}
SampleCode:单元测试
public void RegisterPostReturnsViewIfFirstnameNotSpecified()
{
// Arrange
AccountController controller = GetAccountController();
// Act
ViewResult result = (ViewResult)controller.Register(string username... string password...)
// Assert
Assert.AreEqual(6, result.ViewData["PasswordLength"]);
Assert.AreEqual(See if error message is equal);
}
1 回答
您应该查看“依赖注入”或“控制反转” . 有许多流行的IoC容器允许您在请求新对象(在您的情况下为数据库访问层[DAL])时配置在运行时创建的类型 .
对于DI,基本前提是您告诉控制器“使用此DAL”,而不是控制器决定使用哪个DAL . 使用IoC,您的单元测试可以配置在有人要求DAL时创建的类,并且您的控制器会向容器请求DAL .
一个非常好的起点是Martin Fowler's article.