如何正确使用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)>.

我做错了什么?

谢谢

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

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

顺便说一下,建议-使用ViewBag不是好的做法。定义ViewModels

最新更新