Мокинг наборов данных с помощью Moq
Я пытаюсь начать работу с Moq, но не могу найти хорошие ресурсы для того, что мне нужно.
У меня есть класс интерфейса данных, у которого есть метод Get, который возвращает набор данных через хранимую процедуру. Именно так был написан код, и я не могу его изменить в данный момент, поэтому это нужно сделать таким образом.
Я хочу протестировать этот класс, имитируя набор данных и возвращая данные, поэтому мне не нужно на самом деле вызывать базу данных.
Кто-нибудь делает это, и если да, то где лучше начать это делать?
Ответов (2)2
Для заполнения DataSet не требуется подключение к базе данных. Вы можете издеваться над этим так:
IDataInterface di = new Mock<IDataInterface>();
DataSet mockDataSet = CreateMockDataSet();
di.Expect(x => x.Get()).Returns(mockDataSet);
something.UseDataInterface(di.Object);
Однако заполнение фиктивного DataSet довольно болезненно. Если я делаю это, я обычно помещаю интерфейс фасада перед возвращаемым DataSet, что легче подделать. Или я меняю код, чтобы использовать DataTable, который легче заполнить.
В качестве альтернативы можно использовать встроенную базу данных, такую как SQLite или SQL Server CE, для модульных тестов.
Я также столкнулся с вышеуказанной проблемой и придумал это решение. Я делюсь им, потому что мне не удалось ничего найти в Google по этому поводу:
[TestCategory("GetDataSet")]
[TestMethod]
public void GetDataSet_ValidCall_ShouldPass()
{
// Arrange
var dataSet = Builder<DataSet>.CreateNew().Build();
DataTable table1 = new DataTable();
table1.Columns.Add("Id", typeof(int));
table1.Columns.Add("Name", typeof(string));
table1.Rows.Add("1", "Name1");
DataTable table2 = new DataTable();
table2.Columns.Add("More", typeof(bool));
table2.Rows.Add(false);
dataSet.Tables.Add(table1);
dataSet.Tables.Add(table2);
objectWhichHaveProcMethod.Setup(elem => elem.ExecuteProcAndGetDataSet("YourSprocName", It.IsAny<SqlParameter>(), It.IsAny<SqlParameter>())).Returns(dataSet);
// Act
var response = dataInterfaceClass.Get();
// Assert
Assert.AreNotEqual(response, null);
}