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ディレクトリをプライマリフォルダとして使用する方法についての提案はありますか?