2011-01-25 64 views
0

,并预先感谢您的任何和所有你的帮助。起订量 - 如何嘲笑的方法中的一个方法的结果开始测试

我有我想要测试的方法。

在这个方法中是对UserMembership.Validate() //自定义覆盖的调用,但代码还没有运行,并且超出了测试范围。

我想嘲笑因此(使用MOQ)返回的结果,使该方法的实际测试才能成功。

下面是代码

public LoginResponse Login(LoginRequest request) 
{ 
    var response = new LoginResponse(request.RequestId); 

    // Validate client tag and access token 
    if (!ValidateRequest(request, response, Validate.ClientTag | Validate.AccessToken)) 
     return response; 

    if (!UserMembership.ValidateUser(request.UserName, request.Password)) 
    { 
     response.Acknowledge = AcknowledgeType.Failure; 
     response.Messages = "Invalid username and/or password."; 
     //response.MessageCode = -4; 
     return response; 
    } 

    _userName = request.UserName; 

    return response; 
} 

所以,我的测试是LoginResponse(),但我想 '假' 的UserMembership返回值(布尔)为true ...

够简单了我我确定你们。

TIA,休。

回答

0

在这种情况下,我可以想到模拟UserMembership(假设它不是财产)的唯一方法是使用IoC框架,如Castle WindsorNinject。当您使用IoC容器,你会重构到UserMembership您的通话将一个接口(IUserMembership),并使用容器提供一个实现:

if (Container.Resolve<IUserMembership>().ValidateUser(request.UserName, request.Password)) 

然后在你的单元测试设置,你会登记IUserMembership的实施是模拟对象:

var mock = new Mock<IUserMembership>(); 
Container.Register<IUserMemberhip>().Instance(mock.Object); 

您还必须创建一个生产实现。如果这是标准的UserMembership类,这个实现可能除了UserMembership之外什么也不做。虽然,还有其他方法可以模仿这种鸭子打字。

+0

嗨Kelloti,谢谢你的回复。 – Hugh 2011-01-25 15:44:42

0

你也许可以重新标题你的问题“你怎么用嘲弄的框架,单元测试的99%的时间,”因为你是正确的轨道上正是这样做的 - 一个很典型的用法。

您将要从UserMembership类中提取一个接口(在类中右键单击,选择“重构”,然后选择“提取接口”),然后使用Moq创建该接口的模拟实例以供使用在你的测试中。然后你可以使用最小起订量为“设置”恶搞的行为,在测试期间你想让它什么。语法是这样的:

var userMembershipMock = new Mock<IUserMembership>(); 
userMembershipMock.Setup(m=> m.ValidateUser(It.Is<string>(str=> str == "myUserName"), It.Is<string>(str=> str == "myPassword"))).Returns(true); 

那么你会创建类的新实例,传递IUserMembership你的模拟实例(但因为你会让你的类的构造函数采用的接口类型的参数,你的类不会关心你是否正在传递一个模拟或实际UserMembership实例

MyClass myClass = new MyClass(userMembershipMock.Object); 

之后,你可以开始实际测试你的MyClass的行为:

var request = new LoginRequest { UserName = "myUserName", Password = "myPassword" }; 
LoginResponse response = myClass.Login(request); 

然后你就可以断言类的反应是你所期望的:

Assert.AreEqual(AcknowledgeType.Success, response.Acknowledge); 

,或者你可以验证你模拟的方法(或属性)被调用如你预期:

userMembershipMock.Verify(m=> m.ValidateUser(It.Is<string>(str=> str == "myUserName"), It.Is<string>(str=> str == "myPassword")), Times.Once()); 

等上。

Moq quick start page是一种单页阅读,可以教你99%的知识使用它需要知道的一切。