0

我正在做一个 ASP.Net MVC2 项目,我想对其进行一些单元测试。我试图测试我的 LogOnController 并且遇到了一些困难。在我的 LogOnController 中,我使用 AccountMembershipService 作为,

  AccountMembershipService MembershipService = new AccountMembershipService();

    if (MembershipService.ValidateUser(model.UserName, model.Password)){
    ............
    ..........

    }

我正在使用 MOQ 框架,我想知道如何模拟 AccountMembershipService。即使我给出了正确的用户名和密码“ MembershipService.ValidateUser(model.UserName, model.Password)”总是返回错误。所以你们中的任何人都知道如何做到这一点..

顺便说一句,我尝试过属性注入。但我一直收到以下错误..

“非虚拟(在 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));

         }
4

1 回答 1

0
  • 将 AccountMembershipService 注入 LogOnController。
    • 有两种注射方式。一种是构造函数注入,另一种是属性注入。
    • 下面展示了构造函数注入。
public class LogOnController
{
    public LogOnController():this(new AccountMembershipService()){}
    public LogOnController(AccountMembershipService service){ ... } //ctor for injection
}
  • 确保 ValidateUser 方法是虚拟的。

    • 要模拟,方法应该是虚拟的,这意味着方法是接口、抽象或虚拟的。
  • 模拟 AccountMembershipService 并进行测试。

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)
    {
        ...
    } 
    ...
}

另一种是定义接口并模拟接口而不是实际的 AccountMembershipService 类。为此,您还需要将 DI(依赖注入)更改为使用接口。

public interface IUserValidator
{
    void ValidateUser(string userName, string password)
}
public class AccountMembershipService : IUserValidator
{
}
于 2012-06-27T14:46:16.930 回答