2011-11-19 101 views
1

我是犀牛模拟器和单元测试的新手。我开始为我的wpf mvvm应用程序编写一些测试。下面是一个示例场景,我想测试:犀牛模拟单元测试方法参数

视图模型:

List<DataItems> _theData = new List<DataItems>(); 
public MyViewModel(IServer server) 
{ 
    _server = server; 
    InitializeData(); 
} 

private void InitializeData() 
{ 
    _server.GetData(MyCallback); 
} 

private void MyCallback() 
{ 
    _theData = _server.TheData; 
} 

public List<DataItems> VMData 
{ 
    get 
    { 
    return _theData; 
    } 
} 

服务器:

public List<DataItems> TheData 
{ 
    get 
    { 
    return _cachedData; 
    } 
} 

public void GetData(Action callBack) 
{ 
    //Populate cached data 
    ... 

    if(callBack != null) 
    { 
    callBack(); 
    } 
} 

在我的测试,我想验证viewModel.VMData.Count = = server.TheData.Count。我尝试使用rhino mock来存储服务器,并用一些值预先填充TheData。我调用了视图模型构造函数,然后尝试比较计数。

我的问题是,我不知道如何让我的服务器实际回调我的视图模型。在调用vm构造函数之后,InitializeData()将按预期调用,但不会创建存根服务器的GetData调用。

我该如何做这个简单的测试工作?

+0

嗯,关于Server的'GetData(Action)'方法......并不是100%肯定的,但我不认为你希望客户端通过一个Action来指定服务器返回的结果。有人纠正我,如果我错了。 –

+0

在我的情况下,服务器可能需要一段时间才能检索所需的数据,因此当客户端请求数据时,它会提供回调,以便在数据准备就绪并可用时调用该回调。服务器实际返回的内容不受客户端的影响。 – Flack

+0

我认为如果客户端使用异步检索会更好。 –

回答

0

如果你正在对IServer进行存根操作,并期望在存根上调用方法将调用具体类中的实现,那就是你的误解。存根实例上的GetData方法只会返回您告诉它的内容,而不会在具体依赖项中执行任何代码。请记住,您的存根IServer对象与您的具体IServer实现共同唯一的事情就是它们都实现了IServer。期望在具体实现中的方法中的副作用在调用存根上的方法时发生错误。

至于如何使它工作:没有一个真正的好方法来做这个测试,因为你在说这些类的设计是这样的。您正试图测试您在参与中存在的依存关系中发生的副作用。要真正测试你在这里想要什么,如果你想保持这些关系的类,我建议你不要嘲笑服务器,并使用真实的对象。重新设计服务器,以便它依赖于从缓存中加载的另一个组件,以便您可以替代该存根。