Параметр по ссылке в лямбда-выражении в C # и Microsoft Fakes

1

Я новичок в платформе 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 нашего приложения в более современные технологии доступа к данным нецелесообразно.

Теги:
unit-testing
lambda

1 ответ

1
Лучший ответ

Я больше не требую ответа на этот вопрос. Я удалил строку dataset = new System.Data.DataSet() из моего метода Fake Fill (.FakeDataSet), и все хорошо. Наверное, я переписывал набор данных, переданный по ссылке, с новым, и, как и ожидалось, он не доступен для вызывающего кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню