Мокинг наборов данных с помощью Moq

Я пытаюсь начать работу с Moq, но не могу найти хорошие ресурсы для того, что мне нужно.

У меня есть класс интерфейса данных, у которого есть метод Get, который возвращает набор данных через хранимую процедуру. Именно так был написан код, и я не могу его изменить в данный момент, поэтому это нужно сделать таким образом.

Я хочу протестировать этот класс, имитируя набор данных и возвращая данные, поэтому мне не нужно на самом деле вызывать базу данных.

Кто-нибудь делает это, и если да, то где лучше начать это делать?

Ответов (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);
}