我在学习单元测试的过程中,但对如何将其应用于实际的真实世界感到有些困惑。项目。这些教程似乎都使用了一个简单的单一类应用程序,这使得编写基本单元测试的过程非常简单。但是,当我尝试将其应用于实际的n层项目时,我不知道从哪里开始。我似乎不知道自己应该为单元测试做些什么。
例如,简单的Action Controller方法和类接受用户输入和写入数据库(如果有效):
public class RegisterViewModel
{
[Required]
[Display(Name = "UserName")]
[StringLength(8, MinimumLength = 4, ErrorMessage = "UserName must be between 4 and 8 characters.")]
public string UserName { get; set; }
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
[HttpPost]
public ActionResult Register(RegisterViewModel newUser)
{
if (ModelState.IsValid)
{
_userRepository.AddNewUser(newUser);
}
else
{
return View(newUser);
}
return RedirectToAction("Approval");
}
我试图确定我应该为单元测试编写什么,甚至可以为上面的例子编写哪些单元测试?
我还缺少什么?
答案 0 :(得分:0)
我认为我们需要知道我们正在测试什么。如果我们进行单元测试,那么每个类/系统都会有单独的灯具。当我说夹具时,我指的是给定类的所有测试。
在单元测试场景中,这将是视图模型的一个装置,验证验证是否正常工作以及拥有Register方法的控制器的装置。
因此,对于控制器操作方法,您将要测试逻辑的两个分支。所以在夹具中我有一个
的测试 [Test]
public void should_redirect_to_aprroval_on_post_for_create()
{
//Assert
A.CallTo(() => _fakeUserRepository.Save(A<Athlete>.Ignored));
//Act
var result = (RedirectToRouteResult) _sut.Create(new RegisterViewModel{});
//Assert
Assert.That(result.RouteValues["action"], Is.EqualTo("Approval"));
}
此测试将使用模拟框架模拟UserRepository。这里的语法是FakeItEasy
然后我会测试另一个分支 [Test]
public void should_return_same_view_when_model_is_invalid_on_post_for_create()
{
//Arrrange
_sut.ModelState.AddModelError(String.Empty, String.Empty);
//Act
var result = (ViewResult) _sut.Create(new RegisterViewModel());
//Assert
Assert.That(result.ViewName, Is.EqualTo(String.Empty));
Assert.That(result.Model.GetType(), Is.EqualTo(typeof (RegisterViewModel)));
}
您可以更进一步检查返回视图中的所有值是否正确。
最好包含你的控制器构造函数,以了解我们将要模拟的依赖项。
至于集成测试(针对数据库进行测试)我可能会创建一个单独的测试项目,使用SpecFlow和Selenium来运行实时站点和数据库。