代码之家  ›  专栏  ›  技术社区  ›  alex

如何验证Moq中没有调用该方法?

  •  544
  • alex  · 技术社区  · 17 年前

    Moq ?

    mock.Verify(foo => foo.Execute("ping"), Times.Never());
    
    8 回复  |  直到 11 年前
        1
  •  644
  •   MarredCheese Lionia Vasilev    4 年前

    Times.Never()

    _mock.Object.DoSomething()
    _mock.Verify(service => service.ShouldntBeCalled(), Times.Never());
    
        2
  •  169
  •   Dan Fish    10 年前

    更新

    new Mock<IMoq>(MockBehavior.Strict)
    

    或者,如果你想让你的模拟放松,可以使用。投掷(例外)

    var m = new Mock<IMoq>(MockBehavior.Loose);
    m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
    
        3
  •  56
  •   Shimmy Weitzhandler 500 - Internal Server Error    5 年前

    被盗来源: John Foster's answer to the question, "Need help to understand Moq better"

    当65岁以上的人进入 方法

    [Test]
    public void Someone_over_65_does_not_pay_a_pension_contribution() {
    
        var mockPensionService = new Mock<IPensionService>();
    
        var person = new Person("test", 66);
    
        var calc = new PensionCalculator(mockPensionService.Object);
    
        calc.PayPensionContribution(person);
    
        mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never);
    }
    
        4
  •  12
  •   Liam Joshua    9 年前

    这在Moq的最新版本中不起作用 (至少3.1),应在 Verify 方法如所述 回答。

    .AtMost(0)

    var m = new Mock<ISomething>();
    m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
    

    虽然“投掷”也有效, AtMost(0) 依我之见,它更具表现力。

        5
  •  4
  •   MarredCheese Lionia Vasilev    4 年前

    使用 VerifyNoOtherCalls (要求Moq 4.8或更高版本)

    考虑一下,对模拟的彻底测试有两件事:

    1. 确认没有拨打意外电话

    如果您已经在执行步骤1,添加步骤2是微不足道的:

    // Step 1 (if relevant - see note below)
    mock.Verify(..., Times.Exactly(2));
    mock.Verify(..., Times.Once());
    // ...
    
    // Step 2
    mock.VerifyNoOtherCalls();
    

    备注

        6
  •  1
  •   Neil    4 年前

    当然,最好启用严格模拟(这意味着任何没有明确设置的东西都会抛出异常),然后不要设置任何你不希望被调用的函数。或者换句话说,只设置一个测试期望调用的函数,其他任何函数都会抛出异常。

    var thingBeingTested = new Mock<IThink>(MockBehaviour.Strict);
    
    thingBeingTested.ThisWillThrowAnExceptionBecauseItHasNotBeenMocked();
    
        7
  •  0
  •   Zia Qammar    5 年前

    假设你有这个方法,你想测试它没有被调用

    //Setup    
    var databaseSessionMock = new Mock<IDatabaseSession>();
    databaseSessionMock.Setup(m => m.Commit()).Returns(true).Verifiable();
    RepositoryFactory.Configure<IDatabaseSession>(databaseSessionMock.Object);
    

    你可以这样测试

    databaseSessionMock.Verify(m => m.Commit(It.IsAny()), Times.Never(), "Database Session mock object was not used");
    
        8
  •  -6
  •   Aaron Digulla    17 年前

    推荐文章