验证模拟属性的方法是否以部分字符串作为参数调用

问题描述 投票:0回答:5

我正在使用 MoQ 和 C# 来模拟公共属性,我想知道是否使用以特定字符集开头的任何字符串来调用模拟方法之一。

举个例子,虽然我知道这是可行的:

mockLogger.Verify(x => x.Information($"Entering {methodName}"), Times.Once);

我正在尝试通过以下尝试来查看是否使用以

mockLogger
 开头的参数调用 
Information()
$"Exception in {methodName} - Error Message: {ex.Message} - StackTrace:"

方法
mockLogger.Verify(x => x.Information($"Exception in {methodName}: " +
                                         $"Error Message: {exceptionMessage} - " +
                                         $"StackTrace: ........"), Times.Once);

这不可能吗?或者有什么解决办法吗?

编辑:

我什至尝试过

    mockLogger.Verify(x => x.Information($"Exception in {methodName}: " +
                                         $"Error Message: {exceptionMessage} - " +
                                         $"StackTrace: " + It.IsAny<string>()), 
                                         Times.Once);

但似乎也不起作用。

c# unit-testing mocking moq
5个回答
10
投票

您也可以使用

It.Is<string>()
进行比较。

string searchString = $"Exception in {methodName}: " +
                      $"Error Message: {exceptionMessage} - " +
                      $"StackTrace: ";
mockLogger.Verify(x => x.Information(It.Is<string>(s => s.StartsWith(searchString))), Times.Once);

这可能比我之前建议的使用

It.IsRegex()
更清晰。


1
投票

您不必在验证中检查完全匹配,您可以查找字符串的一部分,例如:

mockLogger.Verify(x => x.Information.IndexOf($"Exception in {methodName}:") >= 0 && x.Information.IndexOf($"Error Message: {exceptionMessage} - ") >= 0 && x.Information.IndexOf($"StackTrace: ") >= 0), Times.Once);

1
投票

您可以使用正则表达式来执行此操作。字符串可以与以正则表达式为参数的

It.IsRegex()
方法进行比较。

一个例子是

string regexString = "" //Substitute for actual regex to search what you want
mockLogger.Verify(x => x.Information(It.IsRegex(regexString)), Times.Once);

来自 Moq 的 quickstart 的以下代码示例显示它在设置中使用,但它也适用于验证:

// matching regex
mock.Setup(x => x.DoSomething(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase))).Returns("foo");

0
投票

另一种可能性是使用 Callback 方法。

Callback
方法可以接收用于调用模拟方法的参数,因此可以执行您需要的任何自定义验证。示例:

[TestMethod]
public void VerifyWithCallback()
{
    // Arrange
    bool startsWith = false;
    const string methodName = "methodName";
    Mock<ILogger> mockLogger = new Mock<ILogger>();
    SomeClassWithLogger cut = new SomeClassWithLogger { Logger = mockLogger.Object };
    mockLogger.Setup(l => l.Information(It.IsAny<string>())).Callback<string>(s =>
    {
        startsWith = s.StartsWith("Entering starts with test");
    });

    // Act
    cut.Logger.Information($"Entering starts with test {methodName}");

    // Assert
    Assert.IsTrue(startsWith);
}

-1
投票

我相信最小起订量文档在验证属性时使用了VerifySet()方法。 看这里:https://github.com/Moq/moq4/wiki/Quickstart

© www.soinside.com 2019 - 2024. All rights reserved.