代码之家  ›  专栏  ›  技术社区  ›  g.pickardou

如何检查多个名为NSubstitute的重载

  •  2
  • g.pickardou  · 技术社区  · 6 年前

    脚本

    我不应该期望sut正在使用哪个重载,只想期望并检查是否调用了任何重载(这将是一个极端的白盒,并期望远远超过功能规格。)

    目前我的结论是我不能利用 .Received 相反,我必须为所有4个重载安装回调,并在其中设置一个变量,在Assert部分我检查该变量。

    有什么简单的方法可以做到我错过的吗?

    (示例)

    [TestMethod]
    public void ShouldLogErrorIfEmailIsInvalid2()
    {
        // Arrange
        var testEmailAddress = "dummy";
    
        //var mock = new Mock<IEMailValidator>();
        var validator = Substitute.For<IEMailValidator>();
        validator.Validate(Arg.Any<string>()).Returns(false);
        var logger = Substitute.For<ILogger>();
    
        var sut = new CustomerController(validator, logger);
    
        var customer = new Customer() { Email = testEmailAddress };
    
        // Act
        sut.Post(customer);
    
        // Assert
        // *** Here I do not want to expect a specific overload of Error, instead any of the 4 overloads satisfies the expectation
        logger.Received(1).Error(Arg.Is<string>( m => m.ToLower().Contains("email")), Arg.Any<object>());
    }
    
    1 回复  |  直到 6 年前
        1
  •  6
  •   David Tchepak    6 年前

    NSubstitute对此没有内置语法,但可以查询所有 ReceivedCalls() 并手动对此进行断言。

    例如:

    var errorCalls = logger.ReceivedCalls()
        .Where(x => x.GetMethodInfo().Name == nameof(logger.Error))
        .Where(x => (x.GetArguments()[0] as string).ToLower().Contains("email"));
    
    Assert.AreEqual(1, errorCalls.Count());
    

    static void ReceivedCallToAny(this object substitute, string methodName, Func<object[], bool> requiredArgs) 有一些帮手,比如 T GetItemAs<T>(object[] items) 访问参数?)