【发布时间】:2021-06-16 21:45:06
【问题描述】:
我关注了这个问题Using Moq to mock only some methods,但仍然抛出异常。
这是我的主要课程。 Foo 充当装饰者。
public class Foo {
public Bar _b {get; set;}
public Foo(Bar b) {
this._b = b;
}
public bool MyMethod(){
return ComplexMethod(_b.name);
}
public bool ComplexMethod(){
...
}
}
测试类
[TestClass]
public class Foo {
[TestMethod]
public void TestFoo() {
var b = new Bar() {name = "name"};
var mock = new Mock<Foo>(b);
mock.CallBase = true;
mock.Setup(x => x.ComplexMethod()).Returns(true);
var result = mock.Object.MyMethod();
...
}
}
抛出异常:
System.NotSupportedException: '不支持的表达式:x => x.ComplexMethod() 不可覆盖的成员(这里:Foo.ComplexMethod) 不能在设置/验证表达式中使用。'
【问题讨论】:
-
只能模拟虚拟方法或接口。使方法虚拟或抽象出一个接口
-
模拟框架有两种类型:受约束的和不受约束的。前者:Moq、NSubstitute、FakeItEasy - 只允许您伪造虚拟会员。后者:TypeMock、JustMock、MS Fakes、Prig、Ionad.Fody、Pose、Harmony、MethodRedirect - 允许你伪造任何你想要的东西:非虚拟、私有和静态成员、密封类等等。