我正在做一个 ASP.Net 的MVC2项目,我想对它做一些单元测试。我尝试测试我的登录控制器,但我遇到了一些困难。在我的LogOnController中,我使用AccountMemberService作为,
AccountMembershipService MembershipService = new AccountMembershipService();
if (MembershipService.ValidateUser(model.UserName, model.Password)){
............
..........
}
我正在使用最小起订量框架,我想知道如何模拟帐户会员服务。即使我给出了正确的用户名和密码" MembershipService.ValidateUser(model.UserName, model.Password)
"总是返回 false。所以你们中的任何一个人对如何做到这一点都有一个想法。
顺便说一下,我已经尝试了属性注入。但是我一直收到以下错误。
"非虚拟(在 VB 中可覆盖)成员上的设置无效:x => x.ValidateUser(.validUserName, .validPassword)" 。
它来自"stubService.Setup(x => x.ValidateUser(model.UserName, model.Password)).Returns(true);
"线。
这是我的代码。
[TestMethod]
public void TestLogOn_ValidUserNameAndPassword()
{
var controller = new LogOnController();
var request = new Mock<HttpRequestBase>(MockBehavior.Loose);
var model = new LogOnModel();
var context = new Mock<HttpContextBase>(MockBehavior.Loose);
var stubService = new Mock<AccountMembershipService>();
model.UserName = "xxxxx";
model.Password = "123";
context.SetupGet(x => x.Request).Returns(request.Object);
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
stubService.Setup(x => x.ValidateUser(validUserName, validPassword)).Returns(true);
Assert.IsTrue(stubService.Object.ValidateUser(model.UserName, model.Password));
}
- 将帐户成员服务注入登录控制器。
- 有两种注射。一个是构造函数注入,另一个是属性注入。
- 下面显示了构造函数注入。
public class LogOnController
{
public LogOnController():this(new AccountMembershipService()){}
public LogOnController(AccountMembershipService service){ ... } //ctor for injection
}
确保验证用户方法虚拟。
- 模拟方法应该是虚拟的,这意味着方法是界面的,抽象的或虚拟的。
模拟帐户会员服务并进行测试。
public void ExampleForMockingAccountMembershipService()
{
var validUserName = "..";
var validPassword = "..";
var stubService = new Mock<AccountMembershipService >();
stubService.Setup(x=>x.ValidateUser(validUserName,validPassword)).Return(true);
Assert.IsTrue(stubService.Object.ValidateUser(validUserName, validPassword));
}
您的问题来自使用不可覆盖的方法,因此您应该将其视为可覆盖。解决方案之一是添加虚拟关键字,如下所示。
public class AccountMembershipService
{
...
public (virtual) bool ValidateUser(string userName, string password)
{
...
}
...
}
另一个是定义接口并模拟接口而不是实际的AccountMemberService类。为此,您还需要将 DI(依赖注入)更改为使用接口。
public interface IUserValidator
{
void ValidateUser(string userName, string password)
}
public class AccountMembershipService : IUserValidator
{
}