2012-03-01 15 views
5

私はWPFアプリケーションのために書いている単体テストをいくつか持っていますが、これを回避しようとする限り、私はViewをインスタンス化するいくつかのコードをテストしています。ビューがインスタンス化されるとすぐに、すべてのマークアップ拡張、スタイルなどが評価されます。これを解決するために、私はダミーアプリケーションを作成し、試験アセンブリが初期化されるときに必要なリソースを登録しました:ユニットテストWPFアプリケーションwith siteoforigin pack Uri

[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); 
     } 
    } 
} 

が、私は過去にこのアプローチを使用しました、そしてそれは大丈夫動作します。

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

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' 

私は展開アイテムとしてリソースディレクトリを追加しました、と私はイメージがあることが確認されましたTestRun出力ディレクトリ。

C::リソース\ \ソリューション\ TestResults \ Workspace_2012-03-01 14_54_29 \ アウト \ AppDomainの1つのフォルダの上にどこ私のテストアセンブリの場所、ファイルが実際にありますので、動作しているようですimage.png

どのようにWPFアプリケーションがプライマリフォルダとしてOutディレクトリを使用できるようにするための提案はありますか?

+0

手動でAppdomainのベースフォルダを強制的に動作させますか? 'AppDomain.CurrentDomain.SetData(" APPBASE "、" FolderNameHere ");' もっと良い方法があるようですが、私の記憶は私には失敗しています。これは十分に良い(tm)かもしれません。 – ianschol

+0

これを何時間も掘り下げました。 AppDomain.CurrentDomain.BaseDirectoryは、Outフォルダーを返します。 – bryanbcook

答えて

3

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

正常に実行されているか、テスト中に次のコードの結果を確認すると、これを確認できます。

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); 

これは最近fixed NUnitの(2.6に含まれる)であったが、それでも他のテストランナーと問題になることがあります。

あなたが興味を持っている場合、これはsiteoforiginコードがやっているのと同等です:

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

はそれとしてbaseDirectoryで最後のスラッシュなしで試してみてください。

+0

はい後続のスラッシュが原因です。私はこれを投稿した直後に発見し、私の発見を追加するために戻っていないが、とにかくあなたの答えを受け入れるだろう。私は実際に2010年にMSTestを使用しています。これも末尾にスラッシュを入れません。 – bryanbcook

+0

ありがとう、私はNUnitに関する仮定を削除するように編集しました。 –

関連する問題