Как правильно использовать Moq Framework - основной вопрос - PullRequest
1 голос
/ 31 августа 2011

Я никогда не использовал фреймворки Mock и фактически не знаком с ASP.NET MVC, тестированием и всем этим связанным с этим материалом.

Я пытаюсь выяснить, как использовать фреймворк Moq для тестирования, но могуне заставит это работать.Вот что у меня сейчас: Мой интерфейс репозитория:

public interface IUserRepository {
    string GetUserEmail();
    bool UserIsLoggedIn();
    ViewModels.User CurrentUser();
    void SaveUserToDb(ViewModels.RegisterUser viewUser);
    bool LogOff();
    bool LogOn(LogOnModel model);
    bool ChangePassword(ChangePasswordModel model);
}

Мой конструктор контроллера, я использую Ninject для инъекций, он отлично работает

private readonly IUserRepository _userRepository;

public HomeController(IUserRepository userRepository) {
    _userRepository = userRepository;
}

Самый простой метод в контроллере:

public ActionResult Index() {
    ViewBag.UserEmail = _userRepository.GetUserEmail();
    return View();
}

И мой метод теста:

    [TestMethod]
    public void Index_Action_Test() {

        // Arrange
        string email = "test@test.com";
        var rep = new Mock<IUserRepository>();
        rep.Setup(r => r.GetUserEmail()).Returns(email);
        var controller = new HomeController(rep.Object);

        // Act
        string result = controller.ViewBag.UserEmail;

        // Assert
        Assert.AreEqual(email, result);
    }

Я предполагаю, что этот тест должен пройти, но он не проходит с сообщением Assert.AreEqual failed. Expected:<test@test.com>. Actual:<(null)>.

Что я делаю не так?

Спасибо

1 Ответ

4 голосов
/ 31 августа 2011

Простой - вы не выполняете роль акта правильно. Во-первых, вы должны вызвать Index() действие контроллера, а затем Assert ViewBag.UserEmail правильность

// Act
        controller.Index();
        string result = controller.ViewBag.UserEmail;

Кстати, совет - использование ViewBag не является хорошей практикой. Вместо этого определите ViewModels

...