如何在 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
}
我想模拟(使用 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
}