簡體   English   中英

如何在ASP.NET MVC的動作方法中模擬方法?

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

我想(用MOQ )模擬CheckCredentials方法,該方法是LoginManager類的一部分。

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視頻,其中將模擬對象作為參數傳遞,但是如果我僅為了能夠創建單元測試而更改方法的參數,那還不是很糟糕嗎? 是這樣做的唯一方法還是還有其他可能性?

您需要為LoginManager類提取一個接口。

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM