5

WPFアプリケーション用に作成している単体テストがいくつかあり、それを回避しようとしたのと同じくらい、ビューをインスタンス化するテスト中のコードがいくつかあります。ビューがインスタンス化されるとすぐに、すべてのマークアップ拡張機能、スタイルなどが評価されます。これを解決するために、ダミーのアプリケーションを作成し、テストアセンブリの初期化時に必要なリソースを登録しました。

[TestClass]
public class AssemblyInitialize
{
    [AssemblyInitialize]
    public static void SetupTestAssembly(TestContext context)
    {
        if (Application.Current == null)
            new Application();

        var resources = new List<string>
            {
              "pack://application:,,,/AssemblyName;component/ResourceDictionary.xaml"
            };

       foreach(var resource in resources)
       {
           var uri = new Uri(resource);
           var dictionary = new ResourceDictionary { Source = uri };
           Application.Current.Resources.MergedDictionaries.Add(dictionary);
       }
    }
}

私は過去にこのアプローチを使用しましたが、問題なく機能します。

私はこのアプローチで小さな障害に遭遇しました。pack:// siteoforigin:をパックUriで使用するリソースがいくつかあります。テストでこのビューをインスタンス化すると、ファイルを解決できないというエラーが発生します。

XAML:

<ResourceDictionary
   xmlns="...">

   <ImageBrush 
      x:Key="ResourceName"
      ImageSource="pack://siteoforigin:,,,/Resources/image.png" 
      />
</ResourceDictionary>

エラーメッセージ:

 Could not find a part of the path 'C:\\Solution\\TestResults\\Workspace_2012-03-01 14_54_29\\Resources\\image.png'

デプロイメントアイテムとしてResourcesディレクトリを追加し、イメージがTestRun出力ディレクトリであることを確認しました。ファイルは実際には次の場所にあるため、AppDomainはテストアセンブリの場所の1つ上のフォルダーを操作しているようです。

c:\ Solution \ TestResults \ Workspace_2012-03-01 14_54_29 \ Out \ Resources \ image.png

WPFアプリケーションでOutディレクトリをプライマリフォルダとして使用する方法についての提案はありますか?

4

2 に答える 2

4

これはAppDomain.BaseDirectory、テストランナーによって設定された文字に末尾の文字がないため'/'です。これにより、パスを解決するコードがsiteoforiginパスの最後のディレクトリを失います。

これは、通常の実行時またはテスト時に次のコードの結果を確認することで確認できます。

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);

これは最近NUnit(2.6に含まれています)で修正されましたが、他のテストランナーではまだ問題になる可能性があります。

siteoforigin興味がある場合、これはコードが実行していることと同等です。

new Uri(new Uri(baseDirectory), "some/relative/path.jpg").LocalPath

の末尾にスラッシュがある場合とない場合で試してくださいbaseDirectory

于 2012-03-28T13:23:17.353 に答える