如何在 ASP.NET MVC 中的操作方法中模拟方法?

How to mock a method within an action method in ASP.NET MVC?

我想模拟(使用 MOQ)方法 CheckCredentials,它是 LoginManager class.

的一部分
public ActionResult Login(string username, string password)
            {
                if (lm.CheckCredentials(username, password) != 0)
                    return RedirectToAction("Index", "Login");

                return RedirectToAction("Index", "Home");
            }

测试方法

public void TestMethod1()
    {
        Mock<LoginManager> mock = new Mock<LoginManager>();

        mock.Setup(x => x.CheckCredentials("", "")).Returns(0); 

        HomeController homeController = new HomeController();

        RedirectToRouteResult ar = homeController.Login("", "") as RedirectToRouteResult;
        ...
    }

现在我的问题是我现在真的不知道如何正确模拟该方法。我看过 YT 视频,其中模拟对象作为参数传递,但如果我必须更改方法的参数才能创建单元测试,那不是很糟糕吗?这是唯一的方法还是有其他可能性?

您需要为您的登录管理器提取一个接口class。

public interface ILoginManager
{
    int CheckCredentials(string userName, string password);
}

public class LoginManager : ILoginManager
{
    public int CheckCredentials(string userName, string password)
    {
        // your existing implementation.
    }
}

并通过构造函数注入将 ILoginManager 的实现注入到您的控制器中。

public class HomeController : Controller
{
    private ILoginManager loginManager;
    public HomeController(ILoginManager loginManager)
    {
        this.loginManager = loginManager;
    }
    public ActionResult Login(string userName,string password)
    {
        if (loginManager.CheckCredentials(username, password) != 0)
                return RedirectToAction("Index", "Login");

        return RedirectToAction("Index", "Home");
    }
}

并在您的测试中,创建 ILoginManager 的模拟版本并使用 SetUp 方法模拟行为。

public void TestMethod1()
{
    var mock = new Mock<ILoginManager>();

    mock.Setup(x => x.CheckCredentials("", "")).Returns(0);

    var homeController = new HomeController(mock.Object);

    var ar = homeController.ReportScore("") as RedirectToRouteResult;

    //TO DO : Assert something

}