Первые модульные тесты! ASP.NET MVC с репозиториями, вызывающими ошибки

Я очень новичок в модульном тестировании, поэтому сегодня я начинаю свой первый набор тестов. Я использую библиотеку JustMock от Telerik. Хотя любая информация о модульном тестировании хороша. У меня возникли проблемы с интерфейсной службой, которая проходит через мой метод. Ниже мой метод 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("[email protected]", "acceptiblePassword")).Returns(Membership.MemberCreateStatus.Success);

        // Model
        var model = new Web.Models.Membership.Registration
        {
            Email = "[email protected]",
            Password = "acceptiblePassword",
            ConfirmPassword = "acceptiblePassword"
        };

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

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

    }

Тест не пройден, потому что membershipService разрешается как null. Я не уверен, что делать здесь. Это мое первое знакомство с аспектом модульного тестирования ASP.NET MVC. Кто-нибудь может дать мне совет?

Я использую Ninject для ввода IMembershipService через конструктор. Он реализован классом MembershipService. Код работает нормально, когда я его запускаю, но модульные тесты терпят неудачу.


person Ciel    schedule 18.02.2011    source источник
comment
Я не вижу, чтобы вы куда-нибудь передавали repository в свой контроллер. Обычно у вас будет IMembershipService в качестве параметра в конструкторе вашего контроллера, который вы можете передать при необходимости или использовать локатор службы MVC, чтобы захватить экземпляр Ninject и передать его.   -  person Buildstarted    schedule 18.02.2011
comment
Да, это была проблема. Я не создавал сервис. Можете ли вы опубликовать это как свой ответ, чтобы я мог отдать должное?   -  person Ciel    schedule 18.02.2011


Ответы (1)


Я не вижу, чтобы вы где-нибудь передавали репозиторий в свой контроллер. Обычно у вас будет IMembershipService в качестве параметра в конструкторе вашего контроллера, который вы затем можете передать, когда это необходимо, или использовать локатор службы MVC, чтобы захватить экземпляр Ninject и передать его.

:)

person Buildstarted    schedule 18.02.2011