3

我正在尝试模拟IDataRecord使用 Moq。

模拟创建如下:

Mock<IDataRecord> mockDataRecord = new Mock<IDataRecord>();

被测试的行是:

DateTime timestamp = dataRecord.GetValueOrDefault<DateTime>("QUEUE_ADD_TS");

试过:

mockDataRecord.Setup(r => r.GetValueOrDefault<DateTime>("QUEUE_ADD_TS")).Returns(now);

...但它给出了运行时错误:

表达式引用了不属于模拟对象的方法: r => r.GetValueOrDefault("QUEUE_ADD_TS")

也尝试替换It.IsAny<String>()"QUEUE_ADD_TS"但没有任何区别。这应该很容易,但我摸不着头脑-感谢您的任何建议!

4

2 回答 2

2

我这样做,又快又脏:

Mock<IDataRecord> dataRecord = new Mock<IDataRecord>();
dataRecord.Setup(column => column["applicationno"]).Returns("foobar");
dataRecord.Setup(column => column["numberOfApplications"]).Returns(12);
于 2017-01-17T08:06:48.097 回答
0

您不能模拟静态或扩展方法,因为大多数模拟框架在后台使用动态代理。

在您的测试中,不要存根扩展方法。相反,存根原始方法本身,例如:

mockDataRecord.Setup(r => r.GetValue<DateTime>("QUEUE_ADD_TS")).Returns(now);

您应该单独测试扩展方法,例如:

  1. 存根 GetValue 方法并断言 GetValueOrDefault 返回存根值。

  2. 不要存根 GetValue 方法,并断言 GetValueOrDefault 返回默认值。

于 2013-05-08T08:42:25.483 回答