Wpf Rhino mocks单元测试方法args

Wpf Rhino mocks单元测试方法args,wpf,unit-testing,mvvm,rhino-mocks,Wpf,Unit Testing,Mvvm,Rhino Mocks,一般来说,我对rhino模拟和单元测试还不熟悉。我开始为我的wpf mvvm应用程序编写一些测试。下面是我尝试测试的一个示例场景: 视图模型: List _theData=newlist(); 公共MyViewModel(IServer服务器) { _服务器=服务器; 初始化数据(); } private void InitializeData() { _GetData(MyCallback); } 私有void MyCallback() { _theData=_server.theData;

一般来说,我对rhino模拟和单元测试还不熟悉。我开始为我的wpf mvvm应用程序编写一些测试。下面是我尝试测试的一个示例场景:

视图模型:

List _theData=newlist();
公共MyViewModel(IServer服务器)
{
_服务器=服务器;
初始化数据();
}
private void InitializeData()
{
_GetData(MyCallback);
}
私有void MyCallback()
{
_theData=_server.theData;
}
公共列表数据
{
得到
{
返回数据;
}
}
服务器:

公共数据列表
{
得到
{
返回缓存数据;
}
}
public void GetData(操作回调)
{
//填充缓存数据
...
if(回调!=null)
{
回调();
}
}
在测试中,我想验证viewModel.VMData.Count==server.TheData.Count。我试着使用rhino Mock来存根服务器,用一些值预先注入数据。我调用了视图模型构造函数,然后尝试比较计数

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


如何使这个简单的测试工作?

如果您正在存根IServer,并且希望在存根上调用方法将调用具体类中的实现,这是您的误解。存根实例上的GetData方法将只返回您告诉它的内容,而不执行具体依赖项中的任何代码。请记住,存根IServer对象与IServer的具体实现唯一的共同点是它们都实现了IServer。当在存根上调用该方法时,期望在具体实现中的方法中出现副作用是错误的


至于如何让它工作:没有一个真正好的方法来做这个测试,正如你所说的,这些类的设计就是这样。您正在尝试测试在您要取消参与的依赖项中是否发生了副作用。为了真正测试您在这里想要什么,并且如果您想让这些类保持这种关系,我建议您根本不要模拟服务器,而是使用真正的对象。重新设计服务器,使其依赖于从缓存加载的另一个组件,以便您可以存根该组件。

hmm,关于
server
GetData(Action)
方法。。。不是100%肯定,但我认为您不希望客户机通过
操作指定服务器返回的内容。如果我错了,有人会纠正我。在我的情况下,服务器可能需要一段时间来检索所需的数据,因此当客户端请求数据时,它会提供一个回调,以便在数据准备就绪且可用时调用该回调。服务器实际返回的内容不受客户端的影响。我认为客户端使用异步检索会更好。请包含您已经尝试过的Rhino.Mocks代码。