单元测试一个基本的“创建用户”#39;方法

时间:2016-10-27 14:06:35

标签: c# asp.net-mvc unit-testing

我在学习单元测试的过程中,但对如何将其应用于实际的真实世界感到有些困惑。项目。这些教程似乎都使用了一个简单的单一类应用程序,这使得编写基本单元测试的过程非常简单。但是,当我尝试将其应用于实际的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");
}

我试图确定我应该为单元测试编写什么,甚至可以为上面的例子编写哪些单元测试?

  • 测试Action Method返回正确的视图吗?
  • 我是否编写确认用户输入有效的单元测试,或者这样做 我假设MVC DataAnnotations将涵盖那个?
  • 将有效用户写入数据库怎么样?我应该测试一下 这个(或者甚至可能吗?

我还缺少什么?

1 个答案:

答案 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来运行实时站点和数据库。