c# Moq 一个带有可选参数的方法

c# Moq a method with an optional parameter

我无法为带有可选参数的方法设置模拟。假设我有一个 class 和类似的界面:

public class Bird : iBird
{
    public void Chirp(string name = "BigBird")
    {
        System.Diagnostics.Debug.WriteLine(name);
    }
}

public interface iBird
{
    void Chirp(string name = "Tweetie");
}

如果我使用参数设置 Chirp 方法模拟:

[TestClass]
public class BirdTests
{
    [TestMethod]
    public void chirpTest()
    {
        var c = new Mock<Bird>();
        c.Setup(x => x.Chirp(It.IsAny<string>()));
        c.Object.Chirp("Woody");
    }
}

当我 运行 我得到的测试:

Test method BirdTests.chirpTest threw exception: System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: x => x.Chirp(It.IsAny())

如果我把 It.IsAny() 去掉,它就不会编译。

如何模拟此方法?

问题其实是方法没有标记virtual,不是方法有可选参数:

Test method BirdTests.chirpTest threw exception: System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: x => x.Chirp(It.IsAny())

为了用 Moq 模拟一个方法,该方法必须标记为 virtual 以便 Moq 生成的代理 class 可以提供它自己的您正在模拟的方法的实现。