我最近开始使用 AutoFixture+AutoMoq,我正在尝试创建一个实例Func<IDbConnection>
(即连接工厂)。
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var connectionFactory = fixture.Create<Func<IDbConnection>>();
这似乎工作得很好:
- 我的测试系统可以调用委托,它会得到一个模拟
IDbConnection
- 然后我可以打电话给
CreateCommand
它,这会让我模拟IDbCommand
- 然后我可以打电话给
ExecuteReader
它,这会让我模拟IDataReader
我现在想在 的模拟上执行其他设置,例如在调用时IDataReader
使其返回。true
Read()
从我读过的内容来看,我应该Freeze
为此使用:
var dataReaderMock = fixture.Freeze<Mock<IDataReader>>();
dataReaderMock.Setup(dr => dr.Read())
.Returns(true);
不过,这似乎不符合我的期望。当我打电话时IDbCommand.ExecuteReader
,我会得到一个不同于我刚刚冻结/设置的阅读器。
这是一个例子:
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var dataReaderMock = fixture.Freeze<Mock<IDataReader>>();
dataReaderMock.Setup(dr => dr.Read())
.Returns(true);
//true - Create<IDataReader> retrieves the data reader I just mocked
Assert.AreSame(dataReaderMock.Object, fixture.Create<IDataReader>());
//false - IDbCommand returns a different instance of IDataReader
Assert.AreSame(dataReaderMock.Object, fixture.Create<IDbCommand>().ExecuteReader());
我究竟做错了什么?我如何获得其他固定装置,例如IDbCommand
,以使用 的模拟实例IDataReader
?