Burjua
Burjua

Reputation: 12706

How to use Moq framework correctly - basic question

I've never used any Mock frameworks and actually new to ASP.NET MVC, testing and all this related stuff.

I'm trying to figure out how to use Moq framework for testing, but can't make it work. that's what I have at the moment: My repository interface:

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);
}

My Controller constuctor, I'm using Ninject for injection, it works fine

private readonly IUserRepository _userRepository;

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

Simplest method in controller:

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

And my test method:

    [TestMethod]
    public void Index_Action_Test() {

        // Arrange
        string email = "[email protected]";
        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);
    }

I assume that this test must pass, but it fails with message Assert.AreEqual failed. Expected:<[email protected]>. Actual:<(null)>.

What am I doing wrong?

Thanks

Upvotes: 1

Views: 1494

Answers (1)

archil
archil

Reputation: 39491

Simple - you do not do Act part correctly. Fisrt you should call Index() action of the controller, and then Assert ViewBag.UserEmail correctness

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

By the way, advice - Using ViewBag is not the good practice. Define ViewModels instead

Upvotes: 4

Related Questions