0

我需要使用 Moq 模拟对 IDataReader.GetValues(array) 的调用。GetValues 方法应使用 DataReader 中当前行的值填充“数组”并返回数据读取器字段计数。

这是我的模拟设置:

var data = new object[] { };

var reader = new Mock<IDataReader>();
reader.Setup(r => r.GetValues(data)).Callback<object[]>(d => {
    Array.Resize(ref d, 2);
    d[0] = "value 1";
    d[1] = "value 2";
}).Returns(2);

...这是正在测试的代码(“_reader”是 Mock 对象):

public int GetValues(object[] values)
{
    int result = _reader.GetValues(values);
    for (int i = 0; i < values.Length; i++)
    {
        // this is not executed because values.Length == 0
    }
    ...

在上面的代码中,result == 2(好的模拟设置正在工作)但“值”永远不会被填充!

如何设置 Mock 对象以填充“值”数组?

4

2 回答 2

0

可以这样做

Mock<IDataReader> dataReader = new Mock<IDataReader>();
object[] copyToData = { "value 1", "value 2"};
dataReader.Setup(m => m.FieldCount).Returns(copyToData.Length);
dataReader.Setup(m => m.GetName(0)).Returns("Column1");
dataReader.Setup(m => m.GetFieldType(0)).Returns(typeof(string));

dataReader.Setup(m => m.GetName(1)).Returns("Column2");
dataReader.Setup(m => m.GetFieldType(1)).Returns(typeof(string));

dataReader.Setup(m => m.GetValues(It.IsAny<object[]>()))
    .Callback(new Action<object[]>(d =>
    {
        Array.Copy(copyToData, 0, d, 0, d.Length);
    }))
    .Returns(() => copyToData.Length);

dataReader.SetupSequence(m => m.Read())
    .Returns(true)
    .Returns(false);
于 2021-11-25T19:06:02.477 回答
-1

因为data在上面的代码中是空的。当您object[]在第一个实例中创建时,您将需要填充它,否则当您模拟调用时它不会有任何内容IDataReader.GetValues

于 2013-03-28T18:10:22.940 回答