MVVM,使用线程+测试获取数据

时间:2014-02-10 09:47:07

标签: c# wpf mvvm tdd

我在考虑如何测试以下场景:我有一个负责获取数据的viewmodel,它还包含一些其他信息,比如负责视图可以绑定的某些元素和诸如此类信息的可见性的参数。我们假设它看起来像这样(简化场景):

public class ViewModel : INotifyPropertyChanged
{
    public ObservableCollection<MessageViewModel> Objects { get; set; }
    private List<MessageDto> _someData; 

    private bool _loadingIndicatorVisible;
    public bool LoadingIndicatorVisible 
    { 
       get { return _loadingIndicatorVisible; } 
       set { _loadingIndicatorVisible = value; OnPropertyChanged(); 
    }

    private bool _isLoading;

    public void StartGettingData()
    {
        if (_isLoading)
            return;

        _isLoading = true;
        LoadingIndicatorVisible = true;

        var taskForGettingData = Task.Factory.StartNew(() => _someData =  WebService.GetMessages());
        taskForGettingData.ContinueWith(task => EndGettingData(), TaskContinuationOptions.NotOnFaulted);
    }

    public void EndGettingData()
    {
        _isLoading = false;
        LoadingIndicatorVisible = false;

        //convert _someData to ObservableCollection<MessageViewModel> - implementation irrelevant
    }
}

现在我想写下面的测试:

void ShouldHaveLoadingIndicatorVisibleWhenLoadingMessages() { /* ... */ }

我该如何处理?让我困惑的是线程的使用。感谢您的任何提示。

1 个答案:

答案 0 :(得分:2)

这是你在那里的一个奇怪的标题......它似乎与你的问题无关。它说 MVVM,使用线程+测试获取数据,但你的问题只是测试名为ShouldHaveLoadingIndicatorVisibleWhenLoadingMessages的UI属性。所以关于使用线程获取数据。

我提出这一点,因为测试数据访问和测试UI是两个完全不同的事情。如果您只想测试用户界面,那么您应该看一下MSDN上的UI Automation Overview为您提供的内容。

但是,如果您只想测试是否正在设置特定属性,无论其在UI中的效果如何,那么您只需对视图模型使用常规测试即可。制作可测试应用程序的秘诀是连接所有相关功能。

通过这个,我的意思是你可以有一个ThreadManager类来处理所有多线程。然后,您需要一个IThreadManager接口和一个实现MockThreadManager接口的IThreadManager,但实际执行主UI线程上的代码ThreadManager类提供的正常功能。话虽如此,只要结果正确合并,在不同线程中运行代码是一个问题。

更重要的是,它将是一个DataProvider类及其IDataProvider接口和MockDataProvider'假'数据提供程序,以便您可以在不触及实际情况的情况下测试视图模型数据库中的数据