2016-05-18 23 views
2

私はIDataReader以上の拡張メソッド(プロジェクトで使用されている)をモックすることを考えています。私はReadAll()(下記)が呼び出されたときにテストデータのコレクションを返したいと思います。モックIDataReader拡張メソッド

public static IEnumerable<object[]> ReadAll(this IDataReader reader) 
{ 
    while (reader.Read()) 
    { 
     var values = new object[reader.FieldCount]; 
     reader.GetValues(values); 
     yield return values; 
    } 
} 

私はカスタムを返すことを目指していますIEnumerable<object[]>コレクション。私はすべてのことが可能であるのならばしかし、私は、Read()ブロックの下にモック実装する方法を考えることはできません、カスタムコレクションに対して数を確認することで

int count = -1; 
var testData = ReadData(); //Custom collection 
DataReaderInfoMock.Setup(x => x.DataReader.Read()).Returns(() => count < testData.Count() - 1).Callback(() => count++); 

Read()方法を嘲笑しました。

私はそれをテストする方法はありますか?

+0

方法は、間接を使用して、オブジェクトに呼び出しをラップし、READALL()を呼び出すメソッドを模擬することができます。 – vibhu

答えて

2

拡張メソッドをモックすることはできませんが、モックとして使用するIDataReaderの独自の実装を記述することができます。そのよう

(私はあなたが必要なメソッドを書いた、のIDataReaderは、より多くのを持っている):

class MockDataReader : IDataReader 
{ 
    private List<object[]> _data; 
    private int _current = -1; 

    public MockDataReader(List<object[]> data) 
    { 
     _data = data; 
    } 

    public int FieldCount 
    { 
     get 
     { 
      return _data.FirstOrDefault()?.Length ?? 0; 
     } 
    } 

    public int GetValues(object[] values) 
    { 
     object[] record = _data[_current]; 

     for (int i = 0; i < record.Length; i++) 
     { 
      values[i] = record[i]; 
     } 

     return record.Length; 
    } 

    public bool Read() 
    { 
     _current++; 

     return _current < _data.Count; 
    } 
}