Имитация наборов данных с помощью Moq

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

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

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

Делает ли кто-нибудь это, и если да, то где хорошее место, чтобы начать делать это?


moq
person Adam    schedule 23.02.2009    source источник


Ответы (2)


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

IDataInterface di = new Mock<IDataInterface>();
DataSet mockDataSet = CreateMockDataSet();
di.Expect(x => x.Get()).Returns(mockDataSet);
something.UseDataInterface(di.Object);

Однако заполнение макета DataSet довольно болезненно. Если я делаю это, я обычно помещаю фасадный интерфейс перед возвращаемым набором данных, который легче имитировать. Или я изменяю код, чтобы использовать DataTable, который легче заполнить.

В качестве альтернативы используйте встроенную базу данных, такую ​​как SQLite или SQL Server CE, для своих модульных тестов.

person Roger Lipscombe    schedule 23.02.2009
comment
гм... так что же делает CreateMockDataSet()? я думал это вопрос - person Igor Meszaros; 01.07.2016
comment
Хорошая точка зрения. Я полагаю, что ОП считал, что им нужно издеваться над интерфейсом DataSet, и мой ответ указывает, что в этом нет необходимости. CreateMockDataSet() просто создаст группу экземпляров DataTable и поместит их в DataSet, как если бы они были возвращены из реальной базы данных. - person Roger Lipscombe; 04.07.2016

Я также столкнулся с вышеуказанной проблемой и придумал это решение. Я делюсь этим, потому что я не смог найти ничего в 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);
}
person Ashish Kumar Jaryal    schedule 23.04.2018