如何正确使用Moq框架 - 基本问题

时间:2011-08-31 12:22:54

标签: asp.net-mvc testing dependency-injection mocking moq

我从来没有使用任何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 个答案:

答案 0 :(得分:4)

简单 - 你没有正确行动部分。 Fisrt你应该调用控制器的Index()动作,然后断言ViewBag.UserEmail正确性

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

顺便说一句,建议 - 使用ViewBag并不是一个好习惯。改为定义ViewModels