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

时间:2015-01-16 18:14:12

标签: c# unit-testing moq

我无法为具有可选参数的方法设置模拟。假设我有一个类和接口,如:

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

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

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

[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");
    }
}

当我运行测试时,我得到:

  

测试方法BirdTests.chirpTest抛出异常:   System.NotSupportedException:非虚拟设置无效   (在VB中可覆盖)成员:x =&gt; x.Chirp(It.IsAny())

如果我拿出It.IsAny(),它就不会编译。

我如何模仿这种方法?

1 个答案:

答案 0 :(得分:1)

问题实际上是该方法未标记为virtual,而不是该方法具有可选参数:

  

测试方法BirdTests.chirpTest引发异常:System.NotSupportedException:非虚拟(在VB中可覆盖)成员上的无效设置:x =&gt; x.Chirp(It.IsAny())

为了使用Moq模拟方法,必须将该方法标记为virtual,以便Moq生成的代理类可以提供它自己实现的模拟方法<。 / p>