Visual Studio/Reflection/Serialization: можно ли экспортировать значения из сеанса отладки, чтобы использовать их для модульного тестирования?

Мне пришлось написать много десятков строк кода (см. здесь: https://dotnetfiddle.net/RiVx2E) чтобы сгенерировать несколько строк демонстрационных данных.

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

new List { 
 { IDMacroTab = 1, IDTab = 1, IDSIot = 2 }
 { IDMacroTab = 1, IDTab = 2, IDSIot 1}
 { IDMacroTab = 1, IDTab = 2, IDSIot = 2}
 { IDMacroTab = 1, IDTab = 2, IDSIot = 3}
 { IDMacroTab = 2, IDTab = 1, IDSIot = 1}
 { IDMacroTab = 2, IDTab = 1, IDSIot = 2 }
 { IDMacroTab = 2, IDTab = 2, IDSIot = 1}
 { IDMacroTab = 2, IDTab = 2, IDSIot = 2}
 { IDMacroTab = 2, IDTab = 2, IDSIot = 3}
 { IDMacroTab = 3, IDTab = 1, IDSIot = 1}
 { IDMacroTab = 3, IDTab = 1, IDSIot = 2}
 { IDMacroTab = 3, IDTab = 2, IDSIot = 1}
 { IDMacroTab = 3, IDTab = 2, IDSIot = 2}
 { IDMacroTab = 3, IDTab = 2, IDSIot = 3}};

Есть ли обходной путь, который позволяет сериализовать объект в строки кода С#, необходимые для его заполнения?


person Revious    schedule 12.10.2018    source источник
comment
Ничего не встроено, и убедитесь, что вы не наступите здесь на скользкий путь. Генерация больших объемов данных для целей модульного тестирования может звучать хорошо в теории, но на практике это может привести к хрупким тестам, просто убедитесь, что вы не повторяете проблему с базой данных для модульных тестов только через код.   -  person Lasse V. Karlsen    schedule 12.10.2018
comment
@LasseVågsætherKarlsen: спасибо. Обычно в моих реальных случаях это не такой большой объем данных... часто это сложные объекты.   -  person Revious    schedule 12.10.2018
comment
Вы можете записать данные в файл, используя JSON. Вы можете проверить переменную в командном окне. Вы можете конвертировать в JSON с помощью Newtonsoft.Json.JsonConvert.SerializeObject(myVariable);. Добавьте File.WriteAllText впереди, чтобы записать текст в файл. Не самый интуитивный способ, но это один из вариантов   -  person Panagiotis Kanavos    schedule 12.10.2018
comment
Проверьте также LINQBridgeVs. Это визуализатор отладчика, который отправляет данные в Linqpad для написания сценариев и тестирования. Вы можете использовать его как есть или изменить код, чтобы создать собственный визуализатор, сохраняющий данные в файлы.   -  person Panagiotis Kanavos    schedule 12.10.2018
comment
Спасибо! ребята. Я также нашел старый плагин. Я попробую: marketplace.visualstudio.com/   -  person Revious    schedule 12.10.2018


Ответы (2)


Третье решение: ObjectDumper.NET

У меня может быть другое решение для вас. Я использовал OmarElabd/ObjectExporter в предыдущих проектах с хорошими результатами, но были проблемы с некоторыми типами (например, сериализация DateTime не работала должным образом в то время). Производительность также была ключевым моментом: некоторые сгенерированные объекты имели размер 50 тыс. строк кода (да, не упоминайте, что это слишком много для одного класса тестовых данных, я знаю, но...).

В конце концов, я начал писать свой собственный ObjectDumper, который вы можете найти здесь в виде пакета NuGet. Исходный код размещен на github, так что не стесняйтесь вносить свой вклад. https://www.nuget.org/packages/ObjectDumper.NET/

Идея ObjectDumper.NET заключается в том, что вы можете вывести любой объект C# обратно в код инициализатора C#. По сравнению с ObjectExporter (который является подключаемым модулем Visual Studio) ObjectDumper устанавливается как пакет NuGet. Это позволяет использовать ObjectDumper во время runtime, а не только во время создания кода.

Пример использования:

[Fact]
public void SerializeObjectsToInitializerCode()
{
    // Create C# object
    var testObjects = new List<TestObject>
    {
        new TestObject {IDMacroTab = 1, IDTab = 1, IDSIot = 2},
        new TestObject {IDMacroTab = 1, IDTab = 2, IDSIot = 1},
        new TestObject {IDMacroTab = 1, IDTab = 2, IDSIot = 2}
    };

    // Pass it to ObjectDumper, choose DumpStyle.CSharp to generate C# initializer code
    var dump = ObjectDumper.Dump(testObjects, DumpStyle.CSharp);

    // Print to console, write to file, etc...
    _testOutputHelper.WriteLine(dump);
}

введите здесь описание изображения

person thomasgalliker    schedule 10.01.2019

Первое решение (частичное)

Я нашел этот вопрос, который может быть очень полезным, но только для какого-то объекта (т.е. списков)

Могу ли я в Visual Studio при отладке кода C# легко экспортировать список или словарь в xml, csv или текстовый формат?

введите здесь описание изображения

введите здесь описание изображения

Второе решение

А также этот плагин ObjectExporter (последнее обновление 2017; проверено в 2018)

https://marketplace.visualstudio.com/items?itemName=OmarElabd.ObjectExporter

введите здесь описание изображения

person Revious    schedule 09.11.2018