Как создать экземпляр окна или смоделировать его программно?

Для некоторых из моих модульных тестов я должен вызывать методы, которые требуют Window в качестве параметра. К сожалению, я не могу передать значение null, так как метод использует окно в качестве ссылки для обновления строки состояния, где я показываю, что на самом деле загружается в реальном приложении.

Поэтому я попытался вызвать конструктор в модульном тесте:

MainWindow window = new MainWindow();

Но это приводит к следующей ошибке в методе InitializeComponent конструктора MainWindow:

System.Windows.Markup.XamlParseException occurred
  Message='Provide value on 'System.Windows.Baml2006.TypeConverterMarkupExtension' threw an exception.' Line number '9' and line position '42'.
  Source=PresentationFramework
  LineNumber=9
  LinePosition=42
  StackTrace:
       at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
  InnerException: System.IO.IOException
       Message=Assembly.GetEntryAssembly() returns null. Set the Application.ResourceAssembly property or use the pack://application:,,,/assemblyname;component/ syntax to specify the assembly to load the resource from.
       Source=PresentationFramework
       StackTrace:
            at MS.Internal.AppModel.ResourceContainer.GetResourceManagerWrapper(Uri uri, String& partName, Boolean& isContentFile)
            at MS.Internal.AppModel.ResourceContainer.GetPartCore(Uri uri)
            at System.IO.Packaging.Package.GetPartHelper(Uri partUri)
            at System.IO.Packaging.Package.GetPart(Uri partUri)
            at System.IO.Packaging.PackWebResponse.CachedResponse.GetResponseStream()
            at System.IO.Packaging.PackWebResponse.GetResponseStream()
            at System.IO.Packaging.PackWebResponse.get_ContentType()
            at System.Windows.Media.Imaging.BitmapDecoder.SetupDecoderFromUriOrStream(Uri uri, Stream stream, BitmapCacheOption cacheOption, Guid& clsId, Boolean& isOriginalWritable, Stream& uriStream, UnmanagedMemoryStream& unmanagedMemoryStream, SafeFileHandle& safeFilehandle)
            at System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy, Boolean insertInDecoderCache)
            at System.Windows.Media.Imaging.BitmapFrame.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy)
            at System.Windows.Media.ImageSourceConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
            at System.Windows.Baml2006.TypeConverterMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
            at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider)
       InnerException: 

Таким образом, мой вопрос, как я могу создать экземпляр или смоделировать окно в модульном тестировании?

Ответ 1

Попробуйте следующее:

if(Application.ResourceAssembly == null)
    Application.ResourceAssembly = typeof(MainWindow).Assembly;
var window = new MainWindow();

Ответ 2

Короткий ответ, что вы не должны. Тестирование устройства не выполняется в интерфейсе пользователя.

Тестирование модулей должно выполняться на вашем логическом коде и что там, где помогают модели, такие как MVC и MVVM. Пользовательский интерфейс должен быть протестирован с использованием таких инструментов, как CodedUI.

если ваша логика имеет зависимость от пользовательского интерфейса, тогда вы делаете это неправильно.