2016-08-31 2 views
1

Я использую MoQ и C# для издевательства публичного свойства, и я хочу знать, был ли вызван один из методов mock с любыми строками, начинающимися с определенным набором символов.C# - Метод метода mocked (MoQ) был вызван с частью строки в качестве параметра

Так, например, в то время как я знаю, что это работает:

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

Я пытаюсь с ниже попытки, чтобы увидеть, если Information() метод mockLogger «s была вызвана с параметром, начиная с $"Exception in {methodName} - Error Message: {ex.Message} - StackTrace:"

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

Это невозможно? Или есть какое-то обходное решение?

EDIT:

Я даже пытался

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

но это, кажется, не работает.

ответ

2

Вы также можете просто использовать 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

Блестящий! Ему понадобилась еще одна закрывающая скобка после 'searchString':' s.StartsWith (searchString))) ', но это именно то, что я искал. Благодарю. – Ash

+0

@AshwinNair Спасибо. Закрывающие скобки в проверке всегда меня бросают по какой-то причине. – LukeW

-1

Я считаю, что документация moq использует метод VerifySet() при проверке свойств. Посмотрите здесь: https://github.com/Moq/moq4/wiki/Quickstart

+0

Спасибо, но как я могу использовать 'VerifySet' для преодоления этой проблемы? Я использовал 'Verify' для проверки свойств и методов, которые были вызваны с определенными параметрами, но я не могу проверить частичные параметры, как упоминалось в моем вопросе. – Ash

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); 
+0

У меня есть метод, называемый 'Information()' в моем классе 'Logger', но' x => x.Information.IndexOf' не распознается, потому что это метод, а не строка. Я хочу посмотреть, начинается ли параметр, переданный информационному методу, определенной строкой. – Ash

1

Вы можете использовать Regex сделать это. Строки можно сравнить с методом 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

Это выглядит многообещающим. Как я могу использовать его в моем случае? – Ash

+0

Я собираюсь ответить ниже, но используя 'mockLogger.Verify (x => x.Error (It.IsRegex ($"^{searchString} ")), Times.Once);' на основе вашего предложения работает как Что ж. – Ash

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); 
}