【发布时间】:2014-09-23 04:57:59
【问题描述】:
我最近开始使用 AutoFixture+AutoMoq,我正在尝试创建 Func<IDbConnection> 的实例(即连接工厂)。
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var connectionFactory = fixture.Create<Func<IDbConnection>>();
这似乎工作得很好:
- 我的测试系统可以调用委托,它会得到一个模拟
IDbConnection - 然后我可以在上面调用
CreateCommand,这会让我模拟IDbCommand - 然后我可以在上面调用
ExecuteReader,这会让我模拟IDataReader
我现在想在 IDataReader 的模拟上执行其他设置,例如在调用 Read() 时使其返回 true。
根据我的阅读,我应该为此使用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 的模拟实例?
【问题讨论】:
-
你基本上看到了这个的含义:github.com/AutoFixture/AutoFixture/issues/176
-
@MarkSeemann 我明白了...查看
MockConfiguratorsource,我可以看到模拟的默认值被设置为DefaultValue.Mock,这就是为什么ExecuteReader成为一个全新的模拟IDataReader。我会看看我是否可以创建自己的配置器来设置每个方法以将模拟调用返回到fixture并从容器中获取它的返回实例。
标签: c# unit-testing moq autofixture automoq