Тестирование окна WPF с помощью StaticResources - PullRequest
11 голосов
/ 14 апреля 2009

У меня есть простое окно со ссылкой на StaticResource в App.xaml.

Определение ресурса App.xaml:

<!-- Standard Text Box Style -->
<Style x:Key="textBoxStyleStd" TargetType="{x:Type TextBox}">
    <Setter Property="FontSize" Value="14" />
</Style>

Компоненты окна, использующие ресурс:

<TextBlock Grid.Column="1" Grid.Row="0" Name="stationIdTitle"
           Style="{StaticResource textBlockStyleStd}"
           VerticalAlignment="Center" HorizontalAlignment="Center"
           Text="{LocText Key=Title, Dict={StaticResource Dictionary},
               Assembly={StaticResource Assembly}}"/>

При попытке выполнить юнит-тестирование этого окна я получаю сообщение об ошибке:

System.Windows.Markup.XamlParseException: не удается найти ресурс с именем '{TextBlockStyleStd}'. Имена ресурсов чувствительны к регистру. Ошибка при объект 'stationIdTitle' в файле разметки Строка 'Zpg; компонент / guicomponenets / screen / enterstationidscreen.xaml' 23 Позиция 71.

Есть ли способ обойти это? Код моего модульного теста:

[Test]
public void TestEnterKeyPressedNoText()
{
    IPickingBusinessObject pickingBusinessObject = mock.StrictMock<IPickingBusinessObject>();

    EnterStationIdScreen objectUnderTest = new EnterStationIdScreen(pickingBusinessObject);

    Assert.AreEqual(Visibility.Visible, objectUnderTest.stationIdError.Visibility);

    Assert.AreEqual("werwe", "oksdf");

    Replay();

    objectUnderTest.EnterKeyPressed();

    Verify();
}

Ответы [ 4 ]

13 голосов
/ 14 апреля 2009

Спасибо, Кент,

Я посмотрел на ваши предложения, и в большинстве сценариев я согласен, что модели следует использовать и тестировать, однако, есть некоторый код, связанный с элементами управления (например, видимость TextBox), который я все еще хотел протестировать. Чтобы обойти это, вы можете создать экземпляр вашего Приложения (но не инициализировать его) и добавить ресурсы вручную. Это приводит к дублированию в App.xaml и тесте базового модуля, но позволяет мне завершить требуемые тесты.

        if (Application.Current == null)
        {
            App application = new App();

            #region Add Static Resources from the App.xaml

            Style textBoxStyle = new Style(typeof(TextBox));
            textBoxStyle.Setters.Add(new Setter(TextBox.FontSizeProperty, 14d));

            Style textBlockStyle = new Style(typeof(TextBlock));
            textBlockStyle.Setters.Add(new Setter(TextBlock.FontSizeProperty, 14d));

            application.Resources.Add("TextBoxStyleStd", textBoxStyle);
            application.Resources.Add("TextBlockStyleStd", textBlockStyle);
            application.Resources.Add("TextBlockStyleError", textBlockStyle);
            application.Resources.Add("Assembly", "Zpg");

            #endregion
        }       
7 голосов
/ 14 апреля 2009

В контексте вашего модульного теста приложение WPF не запущено. Поэтому Window не найдет ресурс.

Мой способ обойти это будет , а не модульный тест ваших просмотров Вместо этого используйте MVVM и проведите модульное тестирование моделей представлений. Если вы хотите проверить свои представления, напишите интеграционные тесты. Ваши интеграционные тесты могут фактически запустить приложение и, следовательно, гораздо более точно имитировать реальную работу вашего приложения.

3 голосов
/ 07 июня 2009

Когда я использую полные имена сборок в моих записях ресурса app.xaml, мне нужно только создать экземпляр класса App (). В этом примере все ресурсы находятся в сборке Majesty_of_Omega_GUI, на которую ссылается UnitTest.DLL

<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Majesty_of_Omega.GUI.App"
StartupUri="Pages/MainPage.xaml"
>
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Majesty_of_Omega_GUI;component/Resources/MainScreens.xaml" />
            <ResourceDictionary Source="pack://application:,,,/Majesty_of_Omega_GUI;component/Resources/PanelResources.xaml" />
            <ResourceDictionary Source="pack://application:,,,/Majesty_of_Omega_GUI;component/Simple Styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
</Application>

Функция тестирования:

    [Test]
    public void Testfunction()
    {
        if (Application.Current == null)
        {
            App application = new App();
        }

        SomePage page = new SomePage();
0 голосов
/ 24 сентября 2010

На самом деле, вы можете использовать одно и то же приложение, и если ресурсы из одной сборки, вы должны вызвать методы InitializeComponents, чтобы заставить его работать ( Источник здесь ).

Хорошего дня!

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