Как сделать модульные тесты осведомленными о Application.Resources - PullRequest
5 голосов
/ 03 февраля 2012

У меня есть ResourceDictionary, включенный в мою область Application.Resources моего проекта WPF.Это

из App.xaml (в порядке этого SO ответа ):

App.xaml:

<Application.Resources>    
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>                
            <ResourceDictionary 
                  Source="MyDictionary.xaml">
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

В этом словаре у меня есть несколько стилей, включая стиль страницы:

MyDictionary.xaml:

<SolidColorBrush x:Key="PageBackgroundBrush" 
                     Color="Black" />

<Style x:Key="PageStyle" TargetType="Page">
        <Setter Property="Background" Value="{StaticResource ResourceKey=PageBackgroundBrush}" />
        <Setter Property="Height" Value="Auto" />
        <Setter Property="Width" Value="Auto" />
    </Style>

MyPage.xaml:

<Page x:Class="MyProject.MyPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="250"
      Title="Page"
      Style="{StaticResource ResourceKey=PageStyle}"
      >
<Grid>
</Grid>
</Page>

MyPage.xaml.cs

public class MyPage : Page
{
    public MyPage() 
    {
        // this part crashes during unit tests because 'PageStyle' was not found
        InitializeComponent();
    }
}

Эта настройка работает достаточно хорошо как при просмотре страницы в Studio, так и при запуске проекта..

Я использую Встроенные в Visual Studio инструменты Unit Test .Когда я пытаюсь выполнить модульные тесты для класса MyPage (который использует MyPage.xaml при запуске конструктора), мои тесты не проходят.MyPage.xaml использует стили, определенные в словаре, включенном в Application.Resources.Тесты не распознают PageStyle, потому что Application.Resources не был включен, когда начался модульный тест, и в результате страница не может быть создана.Как мне включить мой Application.Resources в мои юнит-тесты?В качестве альтернативы, есть ли лучший способ запуска модульных тестов для страниц и окон WPF?

Ответы [ 3 ]

6 голосов
/ 03 февраля 2012

Исходя из вашего комментария, я бы посоветовал вам использовать Model-View-ViewModel (MVVM) или любую другую схему, чтобы извлечь как можно больше логики из компонентов уровня GUI и протестировать это. логика есть. Это напрямую не решает вашу текущую проблему, но факт в том, что логику GUI общеизвестно сложно проверить - настолько сложную, что, по моему мнению, она того не стоит с MS Test и другими участниками модульных тестов.

Модульное тестирование GUI - это мир боли (я пробовал). Как правило, есть лучшие инструменты для этого.

2 голосов
/ 05 сентября 2018

Кажется, что создание экземпляра класса приложения и вызов InitializeComponent делают свое дело.

var app = new App(); //magically sets Application.Current
app.InitializeComponent(); //parses the app.xaml and loads the resources
2 голосов
/ 10 февраля 2016

Я разработал некоторый код, который работает и фактически загружает реальный элемент, которого мне не хватало, хотя подход https://stackoverflow.com/a/748440/57883, вероятно, лучше для изоляции ошибок тестирования и создания библиотеки тестирования.

var targetAssembly = typeof(PracticeManagement.MainWindow).Assembly;
var currentAssembly = this.GetType().Assembly;

Application.ResourceAssembly = targetAssembly;

var rd = (ResourceDictionary)Application.LoadComponent(new Uri("/ProjectName;component/CommonUIStylesDictionary.xaml", UriKind.Relative));

if (Application.Current == null)
{
    var x = new System.Windows.Application(); // magically is assigned to application.current behind the scenes it seems
}

Application.Current.Resources = rd;

var mainWindow = new ProjectName.MainWindow(this.Connection.ConnectionString);

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