【问题标题】:How can I get moq to ignore a function?我怎样才能让起订量忽略一个功能?
【发布时间】:2014-05-27 17:35:56
【问题描述】:

我正在尝试用这种方法模拟 Moq 中的一个类:

public virtual void Init(Context context, IPrincipal user)
{
    _context = context;
    _user = user;

    var u = _context.Users.Include("Foo").First(x => x.Login == _user.Identity.Name);

我调用它的代码如下所示:

mockLoginState.CallBase = false;
mockLoginState.Setup(x => x.Init(It.IsAny<Context>(), It.IsAny<IPrincipal>()));

我不希望实际调用此方法,因为它会访问数据库。根据我对 Moq 的了解,这应该被取消,因为它是虚拟的,并且函数中的代码不应该运行,但这不是我所遇到的。基本上我的问题与这里描述的完全一样: "Short circuiting" void methods with Moq? 但这个问题的答案对我不起作用。

如何阻止函数被调用?

【问题讨论】:

  • 您实际上并没有使用您的链接问题的接受答案中详述的.Verifiable() / .Verify()。如果你添加这些,它会跳过你的方法吗?
  • 你能发布你的完整测试吗?您需要将 mockLoginState.Object 作为此依赖项的实例注入您的 SUT,或者如果此类是您的 SUT,则需要在 mockLoginState.Object 实例上调用正在测试的方法。

标签: entity-framework unit-testing moq


【解决方案1】:

您上面的代码看起来是正确的。您确定要在 Mock 对象上调用 Init 方法吗?在构建Mock&lt;LoginState&gt; 时,您是否尝试过使用MockBehavior.Strict?如果您未明确设置的任何方法被调用,这应该会引发异常。

否则,您可能需要为上下文提供更多代码。

【讨论】:

    【解决方案2】:

    Joe Taylor 的回答是一个线索。

    显然在我的 LoginState 对象的构造函数中调用了 Init 函数。当我创建 Mock&lt;LoginState&gt; 时,它被调用了,因此我的覆盖发生得太晚了。

    有关处理此约束的更多信息,请参阅此问题: Use Moq to mock Constructor?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 2013-10-09
      • 1970-01-01
      相关资源
      最近更新 更多