[英]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.