12

我只想GetValue使用 Moq 模拟以下类的方法:

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()

我有一种感觉,我完全误解了一些东西。我在这里想念什么?任何帮助,将不胜感激

4

2 回答 2

8

好的,我在另一个问题中找到了答案:如何模拟类的内部方法?. 所以这是重复的,可以关闭。

不过,这是解决方案:只需将此行添加到Assembly.config您要测试的项目中:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq
于 2012-06-13T16:11:06.580 回答
0

您是否尝试指定可验证:

my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999).Verifiable();
于 2012-06-13T15:17:58.213 回答