我想使用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的现有实现,并调用mocked方法,从而产生以下输出:
ORIGINAL MyMethod: 999 MOCKED GetValue
但这就是我所得到的:
ORIGINAL GetValue ORIGINAL MyMethod: 10
接着
Moq.MockVerificationException : The following setups were not matched: MyClass mock => mock.GetValue()
我有这种感觉,我完全误解了一些事情.我在这里缺少什么?
任何帮助将不胜感激
解决方法
好的,我在另一个问题中找到了答案:
How to Mock the Internal Method of a class?.所以这是一个重复的,可以关闭.
不过,这里是解决方案:
只需将此行添加到要测试的项目的Assembly.config:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq