【问题标题】:Rhino mocks unit test method argsRhino 模拟单元测试方法 args
【发布时间】:2011-11-19 21:00:33
【问题描述】:

总的来说,我是 rhino 模拟和单元测试的新手。我开始为我的 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 模拟来存根服务器,用一些值预先填充 TheData。我调用了视图模型构造函数,然后尝试比较计数。

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

我怎样才能使这个简单的测试工作?

【问题讨论】:

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

标签: wpf unit-testing mvvm rhino-mocks


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2015-10-21
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多