我有一个模拟。这个模拟有两个方法,MethodA()和MethodB()。我想将这两种方法都设置为返回false。我创建了各种版本的代码,它们都应该可以工作,但有些不能:
这些工作:
1.
var mock = fixture.Freeze<Mock<MyInterface>>();
mock
.Setup(m => m.MethodA(It.IsAny<T>(), It.IsAny<T>()))
.ReturnsAsync(false);
mock
.Setup(m => m.MethodB(It.IsAny<T>(), It.IsAny<T>()))
.ReturnsAsync(false);
var sut = fixture.Create<MySut>();
sut.Do(); // Calls MethodA() and MethodB() - Both return false, works
2.
var mock = new Mock<MyInterface>();
mock.SetReturnsDefault(Task.FromResult(false));
fixture.Inject(mock);
var sut = fixture.Create<MySut>();
sut.Do(); // Calls MethodA() and MethodB() - Both return false, works
3.
var mock = new Mock<MyInterface>();
mock.SetReturnsDefault(Task.FromResult(false));
fixture.Inject(mock.Object);
var sut = fixture.Create<MySut>();
sut.Do(); // Calls MethodA() and MethodB() - Both return false, works
这些不会:
4.
var mock = fixture.Freeze<Mock<MyInterface>>();
mock.SetReturnsDefault(Task.FromResult(false));
var sut = fixture.Create<MySut>();
sut.Do(); // Calls MethodA() and MethodB() - MethodA returns true, fails
5.
var mock = fixture.Create<Mock<MyInterface>>();
mock.SetReturnsDefault(Task.FromResult(false));
fixture.Inject(mock);
var sut = fixture.Create<MySut>();
sut.Do(); // Calls MethodA() and MethodB() - MethodA returns true, fails
6.
var mock = fixture.Create<Mock<MyInterface>>();
mock.SetReturnsDefault(Task.FromResult(false));
fixture.Inject(mock.Object);
var sut = fixture.Create<MySut>();
sut.Do(); // Calls MethodA() and MethodB() - MethodA returns true, fails
根据结果,罪魁祸首似乎是Fixture.Create()方法*。出于某种原因,如果模拟是使用fixture.Create()而不是new关键字创建的,它不会保留我使用SetReturnsDefault()设置的配置,即使模拟被冻结(意味着Fixture.Inject()被调用它)。有人可以解释为什么吗?
脚注:
*当您调用Fixture.Freeze()时, Fixture.Create()也会在内部调用- 冻结只是调用Fixture.Create()后跟Fixture.Inject()的简写
因此,这两个片段是等价的:
var mock = fixture.Freeze<Mock<MyInterface>>();
-
var mock = fixture.Create<Mock<MyInterface>>();
fixture.Inject(mock);