【问题标题】:c# Moq a method with an optional parameterc# Moq 带有可选参数的方法
【发布时间】:2015-03-15 10:14:59
【问题描述】:

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

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

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

测试方法 BirdTests.chirpTest 抛出异常: System.NotSupportedException:非虚拟机上的设置无效 (在 VB 中可重写)成员:x => x.Chirp(It.IsAny())

如果我将 It.IsAny() 取出,它将无法编译。

如何模拟这个方法?

【问题讨论】:

  • 从错误信息来看,似乎不是virtual的方法是问题所在,而不是可选参数
  • 你是对的,我是瞎子。那么,如果你不添加答案,我怎么给你积分呢?
  • 我可以添加一个更详细的答案
  • 如果你模拟iBird,它应该可以正常工作。请注意,在模拟具体对象时,您还应该考虑是否应该调用基类方法。
  • 卡莱布,你是对的。像魅力一样工作。

标签: c# unit-testing moq


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2013-08-11
    • 2016-12-15
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多