第一单元测试!带有存储库的ASP.NET MVC导致错误

时间:2011-02-18 16:12:50

标签: unit-testing asp.net-mvc-3 ninject justmock

我对单元测试很陌生,所以我今天开始进行第一组测试。我正在使用Telerik的库JustMock。虽然任何单元测试信息都很好。我通过我的方法接口服务遇到了一些麻烦。以下是我的MembershipController.Register(model)方法......

    [CaptchaValidator]
    [HttpPost]
    public ActionResult Register(Models.Membership.Registration model)
    {
        // just for good mesure, truncate any spaces that are given 
        System.Text.RegularExpressions.Regex.Replace(model.Email, @"\s", "");

        if (ModelState.IsValid)
        {
            // Attempt to register the User and return any applicable status that has to do
            // with the result.
            var createStatus = membershipService.RegisterMember(model.Email, model.Password);

            // if the member is able to be created successfully, log them in now and begin the
            // authentication portion of the registration, otherwise, display the registration
            // errors and return to the view.
            if (createStatus == Membership.MemberCreateStatus.Success)
            {
                formsAuthentication.SignIn(model.Email, false /* createPersistentCookie */);
                return RedirectToAction("Success");
            }
            else
            {
                ModelState.AddModelError("", Membership.Validator.ErrorCodeToString(createStatus));
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

这是我试图运行的微不足道的测试...

    [TestMethod]
    public void Register_Post_ReturnsRedirectOnSuccess()
    {
        // Arrange
        var controller = Mock.Create<Web.Controllers.MembershipController>();

        var repository = Mock.Create<Membership.IMembershipService>();

        Mock.Arrange(() => repository.RegisterMember("acceptible@email.com", "acceptiblePassword")).Returns(Membership.MemberCreateStatus.Success);

        // Model
        var model = new Web.Models.Membership.Registration
        {
            Email = "acceptible@email.com",
            Password = "acceptiblePassword",
            ConfirmPassword = "acceptiblePassword"
        };

        // Act
        var result = controller.Register(model);

        // Assert
        Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));

    }

测试失败,因为membershipService正在解析为null。我不知道该怎么做。这是我第一次进入ASP.NET MVC的单元测试方面。谁能给我一些建议?

我正在使用Ninject通过构造函数注入IMembershipService。它由类MembershipService实现。运行时代码运行正常,但单元测试失败。

1 个答案:

答案 0 :(得分:1)

我没有看到您将存储库传递到控制器的任何位置。通常,您将IMembershipService作为控制器构造函数中的参数,然后您可以在需要时传入或使用MVC的服务定位器来获取Ninject实例并将其传入。

:)