【问题标题】:MOQ verify for execution doens't workMOQ 验证执行不起作用
【发布时间】:2013-04-25 15:36:06
【问题描述】:

我正在尝试模拟我的内部虚拟方法。 当我调试时,我可以看到我到达了我期望的地方,并且我的内部虚拟方法被执行,但测试失败了。 此外,我验证了“this”上下文是代理而不是常规类实例。

方法:

public void MyMethod() { MyInternalMethod() }
internal virtual void MyInternalMethod() {}

单元测试片段:

Because of = () => { myMock.Object.MyMethod() };

It should_run_inner_internal_virtual_MyInternalMethod = () =>
{
              myMock.Verify(x => x.MyInternalMethod(),Times.Once());
};

我将不胜感激。

亲切的问候。

【问题讨论】:

  • 你确定你在这里测试的是正确的吗?在我看来,您正在尝试测试实现而不是行为。如果您稍后决定内联此行为而不是为其使用单独的方法,那么即使行为没有改变,测试也会失败。你的内部方法应该做什么?你能以某种方式模拟和测试这种行为吗?
  • 我将帖子编辑得更清楚。我想验证执行的方法。几天前我做了一件有趣的事,它(对于另一个单元)有效,我检查了代码,但我仍然无法让它工作。
  • 我理解你想要做什么,但我在质疑 为什么 - 我认为你也应该这样做 =) 但如果你坚持:方法和在同一个程序集中定义单元测试?
  • 它们在不同的程序集中。

标签: c# unit-testing moq


【解决方案1】:

不确定您的代码是否可以编译,但我认为由于 Moq 和被测类位于不同的程序集中,您可能需要告诉被测对象的程序集以使内部对 Moq 的程序集可见。 internal 只使方法/属性/类对该程序集可见。

尝试将其添加到您的 AssemblyInfo.cs 文件中(用于测试中的程序集)

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

假设 DynamicProxyGenAssembly2 是您 Moq 的程序集名称。 如果您的测试也在不同的程序集中,那么您也需要使内部组件对该程序集可见。 我刚刚为此编写了一个 nunit 测试,它通过了。

[Test]
public void ShouldCallMyInternalMethodFromMyMethod()
{
  myMock = new Mock<MyClass>();
  myMock.Object.MyMethod();
  myMock.Verify(mockObj=> mockObj.MyInternalMethod(), Times.Once());
}

【讨论】:

  • 嗨,我的代码可以编译,并且我设法按预期进行了调试。对此程序集的更多其他测试有效。
猜你喜欢
  • 1970-01-01
  • 2012-12-12
  • 2014-07-24
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多