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 可以提供它自己的您正在模拟的方法的实现。
我无法为带有可选参数的方法设置模拟。假设我有一个 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 可以提供它自己的您正在模拟的方法的实现。