C# 如何在要使用NUnit测试的方法内模拟方法调用?

C# 如何在要使用NUnit测试的方法内模拟方法调用?,c#,unit-testing,mocking,nunit,rhino-mocks,C#,Unit Testing,Mocking,Nunit,Rhino Mocks,我试图对一个方法进行单元测试,并模拟其中的方法调用: class LoginViewModel { public bool LogUserIn(string hashedPassword) { //Code if (loginSuccessful) { GoToMainMenu(); // I WANT TO MOCK THIS CALL. return true; }

我试图对一个方法进行单元测试,并模拟其中的方法调用:

class LoginViewModel
{
public bool LogUserIn(string hashedPassword)
    {
        //Code
        if (loginSuccessful)
        {
            GoToMainMenu(); // I WANT TO MOCK THIS CALL.
            return true;
        }
         return false;
    }
}
所以我想模拟GoToMainMenu()函数调用,因为这只是为了导航,当我尝试运行测试时,我在这里抛出了一个异常

我试过使用NUnit。模拟:

    [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"));
    }
但这给了我一个例外


我花了很多时间尝试不同的方法来实现这一点,也尝试过Rhino mock,但我不知道如何模拟这个呼叫。有人能帮忙吗?我没有试过Moq,但怀疑它类似于Rhino Mock。

在您当前的设置中,这是不可能的。有几件事需要解决:

  • 开始使用Rhino的稳定版本(如3.6)。更好的是,升级到Moq,这是一个更新的框架
  • 使
    GoToMainMenu
    方法
    virtual
    (至少
    受保护
您的测试(Rhino 3.6)应该如下所示:

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

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

首先,我将开始了解如何使用mock有很多SO可以帮助您,例如。您通常模拟从一个类到另一个类的交互,而不是类内的交互。
var mock = new Mock<LoginViewModel>();
Assert.AreEqual(true, mock.Object.LogUserIn("aHashedPassword"));