Tôi đang cố gắng làm theo các đề xuất từ Using the WPF Dispatcher in unit tests để chạy thử nghiệm nUnit của mình.Phương pháp đúng để sử dụng Bộ điều phối WPF trong các bài kiểm tra đơn vị
Khi tôi viết bài kiểm tra đơn vị của tôi như dưới đây, nó hoạt động:
[Test]
public void Data_Should_Contain_Items()
{
DispatcherFrame frame = new DispatcherFrame();
PropertyChangedEventHandler waitForModelHandler = delegate(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Data")
{
frame.Continue = false;
}
};
_myViewModel.PropertyChanged += waitForModelHandler;
Dispatcher.PushFrame(frame);
Assert.IsTrue(_myViewModel.Data.Count > 0, "Data item counts do not match");
}
Tuy nhiên, nếu tôi cố gắng sử dụng các gợi ý của DispatcherUtil, nó không hoạt động:
[Test]
public void Data_Should_Contain_Items()
{
DispatcherUtil.DoEvents();
Assert.IsTrue(_myViewModel.Data.Count > 0, "Data item counts do not match");
}
public static class DispatcherUtil
{
[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static void DoEvents()
{
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(ExitFrame), frame);
Dispatcher.PushFrame(frame);
}
private static object ExitFrame(object frame)
{
((DispatcherFrame)frame).Continue = false;
return null;
}
}
Khi tôi đang sử dụng DispatcherUtil, có vẻ như lệnh gọi ExitFrame xảy ra quá sớm, trước khi dữ liệu sẵn sàng.
Tôi có đang sử dụng DispatcherUtil chính xác không? Nó có vẻ như là một phương pháp tốt hơn để sử dụng để xử lý các điều phối thay vì sau đó chờ đợi cho callbacks từ mô hình xem.
Bạn đang cố gắng để kiểm tra, chỉ nếu PropertyChangedEventHandler được gọi cho thuộc tính "dữ liệu"? Nếu vậy tại sao bạn cần phải liên quan đến điều phối viên? Tôi cũng không sử dụng _myViewModel ngoài để đính kèm trình xử lý. – Phil
@Phil: Khi _myViewModel được khởi tạo, hàm tạo của nó thực hiện cuộc gọi asyn. Khi cuộc gọi đó hoàn tất, _myViewModel.Data sẽ có một số giá trị. Tôi đang cố gắng để kiểm tra rằng dữ liệu là trong thực tế dân cư, nhưng thực tế là dữ liệu được dân cư như là kết quả của một cuộc gọi asyn là những gì đang gây ra cho tôi một số rắc rối. Tôi muốn tránh phải nghe các sự kiện PropertyChanged trong bất kỳ bài kiểm tra đơn vị nào có thể phải đối phó với Dispatcher. – Flack