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
)受保护
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"));