打包网址和单元测试.我的环境有问题吗?

Are*_*ren 18 .net c# wpf unit-testing

所以我有一个很好的小MVVM解决方案,而且工作得很好.我有一个标题栏的视图模型,根据应用程序的状态调整图标等.我已经完成了验收测试,视图模型运行良好.

所以我想对这个视图模型的行为进行单元测试.我创建了我的单元测试项目,为视图模型添加了一个新的单元测试,并编写了一个简单的冒烟测试.(即给定模拟依赖项,类将实例化).

巴姆,不

但是,正常运行时该类工作正常.经过进一步检查,我的错误如下:

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

因此,在调用堆栈之后,我得出的结论是,用于加载资源流的包URL是踢错误的.

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

(注:Operations.Shell是集名称,/Media/Images/User_Normal.png是图像路径/名称,而这个包网址工作实践中.)

我的User_Normal.png包含的URL是否存在,文件是否存在,资源是否已正确打包到程序集中(使用反射器检查).

该问题产生于System.Uri该类无法解释包URL.这是我迷路的地方.为什么这不适用于测试范围.我在我的测试项目中引用了所有WPF程序集:

  • WindowsBase
  • PresentationCore
  • PresentationFramework
  • System.Xaml

我错过了什么?

更新

好吧原来的问题是UriHandler没有注册包网址.(感谢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()

它看起来像打包网址试图解决基于网络的装配包网址?看起来处理程序的路由请求错误?或者我错过了什么?

Jul*_*ain 18

我曾经被这个问题咬过......

引用程序集是不够的.WPF需要System.UriParser.Register()使用自己的URI解析器调用,以便System.Uri解释包URL.

反射告诉我们这是由静态构造函数完成的System.IO.Packaging.PackUriHelper.在测试中调用此类的任何方法,PackUriHelper.Create()以确保URI解析器已正确注册.有点丑,但应该工作.

  • 解决了它.WPF框架还需要初始化以向WebRequest/WebResponse添加url-prefix处理程序.我最终实例化了一个`FrameworkElement`对象,它似乎通过静态构造函数加载了足够的框架. (3认同)
  • 创建FrameworkElement将启动与创建应用程序类相同的过程,但它可能会更快.很高兴知道! (2认同)

Gre*_*ing 13

在其他答案的基础上,这是使我的测试变为绿色的(NUnit)代码:

在AssemblyInfo.cs中:

[assembly: RequiresSTA]
Run Code Online (Sandbox Code Playgroud)

在它自己的文件中:

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

App是我的主要应用程序类.据推测,相关集会中的任何一类都会这样做.