Упакуйте URL-адреса и модульное тестирование. Проблема с моим окружением? - PullRequest
18 голосов
/ 14 сентября 2010

Итак, у меня есть это милое маленькое решение MVVM, и все отлично работает.У меня есть модель представления для панели заголовка, которая корректирует значок в зависимости от состояния приложения и т. Д. Я провел приемочные тесты, модель представления отлично работает.

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

Bam, no

Однако класс работает нормально, когда работает в обычном режиме.При дальнейшей проверке моя ошибка выглядит следующим образом:

TestInitialize threw exception: System.UriFormatException: Invalid URI: Invalid port specified.

Итак, после стека вызовов я прихожу к выводу, что мои пакеты пакетов, используемые для загрузки потоков ресурсов, являются теми, которые выводят ошибки.

pack://application:,,,/Operations.Shell;component/Media/Images/User_Normal.png

(Примечание: Operations.Shell - это имя сборки, /Media/Images/User_Normal.png - путь / имя образа, и этот пакет URL работает на практике.)

Является ли URL-адрес пакета для моего User_Normal.png, файл существует, ресурс правильно упакован в сборку (проверено с помощью рефлектора).

Проблема возникает из-за того, что класс System.Uri не может интерпретировать URL пакета. Здесь я заблудился .Почему бы это не сработало в рамках тестирования.У меня есть все сборки WPF, на которые есть ссылки в моем тестовом проекте:

  • WindowsBase
  • PresentationCore
  • PresentationFramework
  • System.Xaml

Что мне не хватает?

Обновление

Хорошо, поэтому оригинальная проблема заключалась в том, что UriHandler не был зарегистрирован для URL-адресов пакетов.(Спасибо Julien Lebosquain) Теперь, когда это исправлено, у него все еще есть проблемы.

TestInitialize threw exception: System.NotSupportedException: The URI prefix is not recognized.

System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase)
System.Net.WebRequest.Create(Uri requestUri)
MS.Internal.WpfWebRequestHelper.CreateRequest(Uri uri)
System.IO.Packaging.PackWebRequest.GetRequest(Boolean allowPseudoRequest)
System.IO.Packaging.PackWebRequest.GetResponse()
MS.Internal.WpfWebRequestHelper.GetResponse(WebRequest request)
System.Windows.Media.Imaging.BitmapDecoder.SetupDecoderFromUriOrStream(Uri uri, Stream stream, BitmapCacheOption cacheOption, Guid& clsId, Boolean& isOriginalWritable, Stream& uriStream, UnmanagedMemoryStream& unmanagedMemoryStream, SafeFileHandle& safeFilehandle)
System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy, Boolean insertInDecoderCache)
System.Windows.Media.Imaging.BitmapImage.FinalizeCreation()
System.Windows.Media.Imaging.BitmapImage.EndInit()
System.Windows.Media.Imaging.BitmapImage..ctor(Uri uriSource, RequestCachePolicy uriCachePolicy)
System.Windows.Media.Imaging.BitmapImage..ctor(Uri uriSource)
MyFramework.Resources.b__1(Uri u)
MyFramework.Resources.ResourceType`1.Load(String path)
Operations.Shell.AppShell.ViewModels.HeaderViewModel..ctor(IEventAggregator eventAggregator, ISecurityService securityService)
Tests.Shell.AppShell.TestHeaderViewModel.TestInitialize()

Похоже, что URL-адрес пакета пытается найти что-то в Интернете для URL-адреса пакета сборки?Похоже, обработчик неправильно направил запрос?Или я что-то упустил?

Ответы [ 4 ]

18 голосов
/ 14 сентября 2010

Эта проблема меня укусила однажды ...

Ссылка на сборки недостаточна.WPF должен вызвать System.UriParser.Register() со своим собственным анализатором URI, чтобы System.Uri мог интерпретировать URL-адреса пакетов.

Отражение говорит нам, что это делается статическим конструктором System.IO.Packaging.PackUriHelper.Вызовите любой метод этого класса в вашем тесте, например PackUriHelper.Create(), чтобы убедиться, что анализатор URI хорошо зарегистрирован.Вроде некрасиво, но должно сработать.

13 голосов
/ 26 января 2011

Основываясь на других ответах, вот код (NUnit), который сделал мои тесты зелеными:

В AssemblyInfo.cs:

[assembly: RequiresSTA]

В своем собственном файле:

[SetUpFixture]
public class PreTestSetup
{
    [SetUp]
    public void Setup()
    {
        PackUriHelper.Create(new Uri("reliable://0"));
        new FrameworkElement();
        System.Windows.Application.ResourceAssembly = typeof (App).Assembly;
    }
}

Приложение - это мой основной класс приложений. Предположительно подойдет любой класс в соответствующей сборке.

4 голосов
/ 22 декабря 2010

Небольшой пример кода для добавления к ответам выше.Мы используем следующее в модульном тесте, чтобы обойти эту проблему.

    [AssemblyInitialize]
    public static void MagicHappensHere(TestContext context) {

        PackUriHelper.Create(new Uri("reliable://0"));
    }

После вызова при запуске теста все работает отлично.

1 голос
/ 14 сентября 2010

Я думаю, вы можете это исправить, создав экземпляр вашего основного класса приложения перед выполнением каких-либо тестов.Это подключит обработчики, которые Жюльен упоминает в другом ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...