Это не позволяет вам смоделировать SqlDataReader
, но если ваша функция возвращает DbDataReader
(базовый класс SqlDataReader
) или IDataReader
, то самый простой способ смоделировать это просто использовать DataTable
или DataSet
и вызовите функцию CreateDataReader()
и верните ее.
Во-первых, в отдельном проекте выполните свой запрос, как обычно, чтобы получить некоторые тестовые данные, и используйте WriteXmlSchema
для создания файла .xsd и функции WriteXml
для хранения тестовых данных.
using (var con = new SqlConnection(connectionString))
{
con.Open();
using (var cmd = new SqlCommand("Some query", con))
{
DataSet ds = new DataSet("TestDataSet");
DataTable dt = new DataTable("FirstSet");
ds.Tables.Add(dt);
using (var reader = cmd.ExecuteReader())
{
dt.Load(reader);
}
ds.WriteXmlSchema(@"C:\Temp\TestDataSet.xsd");
ds.WriteXml(@"C:\Temp\TestDataSetData.xml");
}
}
В вашем тестовом проекте добавьте TestDataSet.xsd
к проекту и убедитесь, что он имеет пользовательский инструмент MSDataSetGenerator
(он должен иметь его по умолчанию). Это приведет к созданию производного класса DataTable
с именем TestDataSet
, который будет иметь схему вашего запроса.
Затем добавьте TestDataSetData.xml
в качестве ресурса в ваш тестовый проект. Наконец, в вашем тесте создайте TestDataSet
и вызовите ReadXml
, используя текст из сгенерированного вами xml-файла.
var resultSet = new TestData.TestDataSet();
using (var reader = new StringReader(Resources.TestDataSetData))
{
resultSet.ReadXml(reader);
}
var testMock = new Mock<DbCommand>();
testMock.Setup(x => x.ExecuteReader())
.Returns(resultSet.CreateDataReader);
testMock.Setup(x => x.ExecuteReaderAsync())
.ReturnsAsync(resultSet.CreateDataReader);
Это создаст средство чтения данных, которое будет работать так же, как средство чтения данных, которое было бы возвращено из запроса sql, и даже поддерживает такие вещи, как возвращение нескольких наборов результатов.