ASP.Net 帐户会员服务最小起订量



我正在做一个 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
{
}

最新更新