繁体   English   中英

如何在我想要使用NUnit测试的方法中模拟方法调用?

[英]How do I mock a method call inside the method I want to test using NUnit?

我正在尝试对方法进行单元测试并模拟其中的方法调用:

class LoginViewModel
{
public bool LogUserIn(string hashedPassword)
    {
        //Code
        if (loginSuccessful)
        {
            GoToMainMenu(); // I WANT TO MOCK THIS CALL.
            return true;
        }
         return false;
    }
}

所以我想模拟GoToMainMenu()函数调用,因为这只是用于导航,当我尝试运行我的测试时,我得到一个异常抛出。

我尝试过使用NUnit.Mocks:

    [Test]
    public void Log_User_In_Will_Return_True()
    {
        DynamicMock mockView = new DynamicMock(typeof(LoginViewModel));
        mockView.ExpectAndReturn("GoToMainMenu", null);
        LoginViewModel loginVM = (LoginViewModel)mockView.MockInstance; //ArgumentException
        Assert.AreEqual(true, loginVM.LogUserIn("aHashedPassword"));
    }

但这给了我一个ArgumentException。

我花了很多时间尝试不同的方法来完成这项工作,并且还尝试过Rhino Mocks但是无法理解如何模拟这个调用。 有人能帮忙吗? 我没有尝试过Moq,但怀疑它与Rhino Mocks类似。

在您当前的设置中,您尝试做的事情是不可能的。 几件事情无法解决:

  • 开始使用稳定版的Rhino(如3.6)。 更好的是,升级到Moq,这是一个更新的框架
  • 使GoToMainMenu方法virtual (至少protected

那么你的测试(Rhino 3.6)应如下所示:

var mock = MockRepository.GenerateMock<LoginViewModel>();
Assert.AreEqual(true, mock.LogUserIn("aHashedPassword"));

这里有几点需要注意。 调用的任何非虚方法都将使用您的原始实现(如LogUserIn )。 另一方面,每个虚拟方法都将由具有默认( 不执行任何 )实现的RhinoMocks替换,这应该足以使测试通过。 在Moq进行相同的测试:

var mock = new Mock<LoginViewModel>();
Assert.AreEqual(true, mock.Object.LogUserIn("aHashedPassword"));

它的工作方式(需要有virtual方法)是因为在创建模拟时,Rhino和Moq都会在内存中生成程序集并在那里创建新类型,从你的类型派生(在你的情况下,是LoginViewModel )。 派生类型(模拟)可以替换任何原始类型的方法,因为它是virtual (标准C#机制)或类型是接口 - 然后模拟只是实现接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM