Я новичок в платформе Microsoft Fakes и пытаюсь прошить какой-то стандартный старый код ADO.NET, чтобы обойти соединение с базой данных вообще для моего модульного теста. У меня есть Shim'd SqlConnection, SqlCommand и SqlDataAdapter (через DbDataAdapter), и я пытаюсь подделать метод Fill (DataSet) на адаптере данных. Кажется, что все хорошо работает после того, как мои поддельные Fill запускают, что вручную добавляет таблицу в набор данных, тестируемый код, похоже, не видит набор данных, который я создал. Это как будто объект набора данных передается по значению, а не по ссылке.
Вот код под тестированием (VB.NET):
Dim cn As New SqlConnection(DB("CIMS"))
Dim cmd As New SqlCommand
Dim ds As New DataSet
...
Dim da as New SqlDataAdapter(cmd)
da.Fill(ds)
И вот единичный тест (С#):
using (ShimsContext.Create())
{
// arrange
ShimSqlConnection.ConstructorString = (@this, connectionString) => new ShimSqlConnection();
ShimSqlCommand.Constructor = (@this) => new ShimSqlCommand();
ShimSqlConnection.AllInstances.Open = (@this) => { };
ShimSqlConnection.AllInstances.Close = (@this) => { };
ShimDbDataAdapter.AllInstances.FillDataSet = (DbDataAdapter @this, DataSet dataset) =>
{
dataset = new System.Data.DataSet();
dataset.Tables.Add();
return 0;
};
...
При отладке этого теста поток кода вводит фальшивую функцию FillDataSet просто отлично, набор данных получает таблицу, но после выхода из функции набор данных, на который ссылается ds, показывает 0 таблиц в коллекции таблиц. Я также попытался установить свойство DataSetName, которое он принимает в тестовом выражении с помощью тестируемого кода, никогда не видит нового имени.
На данный момент преобразование en-masse нашего приложения в более современные технологии доступа к данным нецелесообразно.
Я больше не требую ответа на этот вопрос. Я удалил строку dataset = new System.Data.DataSet()
из моего метода Fake Fill (.FakeDataSet), и все хорошо. Наверное, я переписывал набор данных, переданный по ссылке, с новым, и, как и ожидалось, он не доступен для вызывающего кода.