模拟一个私人领域

Sam*_*ney 3 c# unit-testing rhino-mocks moq nmock

我知道有人问过类似的问题,但没有找到明确的解决方案。我正在尝试从一个大类中模拟一个私有字段。私有字段在某些较早的方法中实例化,而我正在尝试对引用该字段的后一种方法进行单元测试。

所以我在课堂上有一个更早的方法:

public bool validateAll(ref DataEntry[] oEntries, string sMediaPlanId, ITemplateGenerator oTempGen)
{
  ...
  // private field that I am trying to mock
  this._sMediaPlanObjective = (MPWrapper.Instance).getMediaPlanObjective(sMediaPlanId);
  ...
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试对引用私有字段的方法进行单元测试:

public bool validateFlightObjective(ref MPDataEntry oEntry)
{
  ...
  string entryFlightObjective = oEntry.getFlightObjective();
  string mediaPlanObjective = this._sMediaPlanObjective;

  if (entryFlightObjective != mediaPlanObjective)
  {
    return false;
  }
  ...

  return true;      
}
Run Code Online (Sandbox Code Playgroud)

鉴于我有一个大类,而这只是我要测试的一种方法,是否有可能仅模拟此私有字段的方法?我是缺少基本的东西还是应该考虑其他方法?

k.m*_*k.m 5

您不能模拟任何私有,静态或本质上不可替代的东西(这是免费的模拟库限制)。

你通常在这种情况下做什么(当它出现时该private成员具有进行测试),被提取的private成员,以一个单独的类和注射它来测试类的依赖。

在您的情况下,您实际上需要提取创建代码的代码_sMediaPlanObjective,这是以下行:

this._sMediaPlanObjective =
    (MPWrapper.Instance).getMediaPlanObjective(sMediaPlanId);
Run Code Online (Sandbox Code Playgroud)

提供getMediaPlanObjective方法的对象应该注入到测试过的类中。如果这样做,您可以简单地模拟该对象,并告诉它返回的模拟版本_sMediaPlanObjective