Модульное тестирование привязки данных в WPF - PullRequest
6 голосов
/ 12 ноября 2011

Я пытаюсь выполнить модульное тестирование пользовательского элемента управления WPF с помощью NUnit.Элемент управления представляет собой ListView кнопок, связанных со списком (DataContext устанавливается в конструкторе элемента управления).

Я хотел бы написать тесты, которые (например) добавляют элементы в список и проверяют, чтоновая кнопка добавляется в представление и т. д. Однако, когда я добавляю элемент в список в моем тесте NUnit, он все равно сообщает, что ListView пуст.Все работает нормально, когда я запускаю свое приложение.

Я включил соответствующий код ниже.Что мне нужно сделать, чтобы проверить это?

XAML:

<ListView x:Class="SoundBlock"
          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"
          ItemsSource="{Binding Path=Sounds}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding Title}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Определение класса

public partial class SoundBlock : ListView
{
    public SoundBlock(Board xiBoard)
    {
        // Initialize.
        InitializeComponent();

        // Set the data context for this block.
        DataContext = xiBoard; // Board has an ObservableCollection<Sound> 
                               // property called Sounds.
    }
}

Контрольный пример

[Test]
public void TestAddSound()
{
    board = new Board();
    block = new SoundBlock(board);
    Assert.AreEqual(0, block.Items.Count);

    sound = new Sound("sound.mp3");
    board.Sounds.Add(sound);
    Assert.AreEqual(1, block.Items.Count); // This fails - count is still 0
}

Ответы [ 3 ]

4 голосов
/ 12 ноября 2011

См. Мой вопрос: Сила связывания в WPF

Вы должны принудительно выполнить привязку, она не будет работать, пока не будет показан контроль. Вы можете поместить его в новое окно и показать окно.

3 голосов
/ 21 декабря 2011

Я не уверен, что именно происходит и почему это работает, но если вы используете этот маленький вспомогательный класс для установки контекста данных в элементе управления, который вы хотите проверить, то он работает.

0 голосов
/ 12 ноября 2011

Поскольку вы привязали свой ItemSource к списку, чтобы любое изменение в коллекции не распространялось на элемент управления UI, поскольку List не реализует INotifyCollectionChanged и, следовательно, никаких изменений не будет отображаться в пользовательском интерфейсе.

Вы можете использовать ObservableCollection<Sound> вместо List<Sound>.ObservableCollection внутренне реализует интерфейс INotifyCollectioChanged.

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