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」はモックオブジェクトです):

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
    }
    ...

上記のコードでは、結果 == 2 (OK モック セットアップは機能しています) ですが、「値」は入力されません!

「値」配列を設定するためにモックオブジェクトを設定するにはどうすればよいですか?

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 に答える