У меня есть StringTable.xaml в моем проекте WPF с <system:String x:Key="IDS_DATA_HEADER_TIMED_TEST_RECORD_NUMBER">Record Number</system:String>
.Моя модель использует этот StringTable с public static string foobar = (string)Application.Current.FindResource("PLACEHOLDER_TEXT");
Таким образом, я не могу провести модульное тестирование моей модели в MSTest, не зная о xaml.
Этот вопрос занимает нишу, потому что многие вопросы о xaml связаны с тем, как подключиться к GUI.Да, хорошей практикой является использование шаблона MVVM для отделения модели от GUI и только для тестирования модели.Да, у меня, вероятно, слишком тесно связана модель с каркасом GUI, и поэтому я не смогу легко переключиться с WPF на другой.
В моих модульных тестах, если я пытаюсь использовать функцию, которая использует StringTable.xaml, я заметил одну из трех ошибок:
System.Windows.ResourceReferenceKeyNotFoundException: 'PLACEHOLDER_TEXT'ресурс не найден.
или
Исключение нулевого указателя при попытке использовать переменную foobar
или
Ошибка приведения / преобразования при попытке преобразовать необнаруженный ресурс в строку с помощью (string) Application.Current.FindResource ("PLACEHOLDER_TEXT");
Для пояснения, StringTable.xaml добавляется какобъединенный словарь в моем файле App.xaml:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="PlaceholderNamespace/SomeStyles.xaml"/>
<ResourceDictionary Source="PlaceholderNamespace/NumberTable.xaml"/>
<ResourceDictionary Source="PlaceholderNamespace/StringTable.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Я проследил за публикацией Уэсли в аналогичном переполнении стека и добавил (фрагмент кода точно дублирован):
var app = new App(); //magically sets Application.Current
app.InitializeComponent(); //parses the app.xaml and loads the resources
к началу моих тестов.Это хорошо работает при запуске одного модульного теста за раз.Однако, если я пытаюсь запустить несколько модульных тестов последовательно, я получаю сообщение об ошибке:
Невозможно создать более одного экземпляра System.Windows.Application в одном и том же домене приложений
Таким образом, я должен запустить каждый модульный тест.Один.В.Время.Это раздражает, поэтому я либо начну пихать весь свой тестовый код в как можно меньшее количество тестов (что отрицательно сказывается на цели), либо буду выполнять их реже, чем нужно, потому что это займет много времени, чтобы пройти мой набор тестов (какой вид побеждает цель).Если у меня есть только в начале первого модульного теста в последовательности, я заметил ранее заявленные ошибки.Это подразумевает, что ресурсы, казалось, выгружались после первого теста.Но AppDomain все еще там.
Я использую MSTest, но прочитал, что NUnit также страдает той же проблемой, что и не создание новых доменов приложений. Ответ Джереми Вибе на переполнение стека о том, что MSTest упоминает, что создание нового домена приложений стоит дорого.Это ответило бы, почему это не создано больше чем один раз, но не как обойти это для моего случая.
Интересно, что я на самом деле вижу, как первый тест прошел успешно, пока второй обрабатывает.Когда оба теста завершены, они оба не пройдут.Это как если бы тест мог задним числом провалиться, потому что домен приложения пытался измениться.
Кто-нибудь знает, как я могу загрузить все ресурсы StringTable.xaml в Application.Current, и сохранить ли его все модульные тесты в последовательности?