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

标签 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;
        }
         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方法虚拟(并且至少 protected )

你的测试(Rhino 3.6)应该是这样的:

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

这里有几点需要注意。调用的任何非虚拟方法都将使用您的原始实现(如 LogUserIn)。另一方面,每个虚拟方法都将被 RhinoMocks 替换为默认(什么都不做)实现,这应该足以使测试通过。最小起订量中的相同测试:

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

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

关于c# - 如何在我想使用 NUnit 测试的方法中模拟方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27115376/

相关文章:

c# - 注销使用 DependencyProperty.RegisterAttached 创建的属性

java - 如何使用 PowerMock 和 EasyMock 模拟非静态私有(private)内部 java 类?

asp.net-mvc - 如何模拟 ServiceStackController Cache 属性?

c++ - 通过 C++ 中的工厂传递模拟

c# - PropertyChanged 在 ViewModelBase 中始终为 null

c# - 您如何使用 StructureMap v2.6 解析 signalR v2.0

c# - 使用 C# 从 XML 文件中删除数据?

maven - 在 Surefire Maven 插件中 fork : is it safe to use forking?

node.js - 使用 Spectron 和 Travis 测试 Electron 应用程序

node.js - 如何通过持续集成自动化 karma 单元测试