部分嘲笑具有最小起订量的类
本文关键字: | 更新日期: 2023-09-27 18:37:15
我只想使用 Moq 模拟以下类的 GetValue
方法:
public class MyClass
{
public virtual void MyMethod()
{
int value = GetValue();
Console.WriteLine("ORIGINAL MyMethod: " + value);
}
internal virtual int GetValue()
{
Console.WriteLine("ORIGINAL GetValue");
return 10;
}
}
我已经阅读了一些它应该如何与 Moq 一起工作。我在网上找到的解决方案是使用 CallBase
属性,但这对我不起作用。
这是我的测试:
[Test]
public void TestMyClass()
{
var my = new Mock<MyClass> { CallBase = true };
my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999);
my.Object.MyMethod();
my.VerifyAll();
}
我希望 Moq 使用现有的 MyMethod
实现并调用模拟方法,从而产生以下输出:
ORIGINAL MyMethod: 999
MOCKED GetValue
但这就是我得到的:
ORIGINAL GetValue
ORIGINAL MyMethod: 10
然后
Moq.MockVerificationException : The following setups were not matched: MyClass mock => mock.GetValue()
我有一种感觉,我完全误解了什么。我在这里错过了什么?任何帮助将不胜感激
好的,我在另一个问题中找到了答案:如何模拟类的内部方法?所以这是一个重复的,可以关闭。
不过,这是解决方案:只需将此行添加到要测试的项目的Assembly.config
:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq
您是否尝试指定可验证:
my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999).Verifiable();