2016-08-31 5 views
1

MoQとC#を使用してパブリックプロパティをモックしています。特定の文字セットを使用します。例えばのでC# - 模擬(MoQ)プロパティのメソッドが、文字列の一部をパラメータとして使用して呼び出されたことを確認しました。

、私はこの作品を知っている間:

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

私はmockLoggerInformation()方法が$"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

'Logger'クラスに' Information() 'というメソッドがありますが、' x => x.Information.IndexOf'は文字列ではないメソッドなので認識されません。私は、情報メソッドに渡されたパラメータが特定の文字列で始まるかどうかを確認したい。 – Ash

1

あなたが行うために正規表現を使用することができますこの。文字列は、正規表現をパラメータとするIt.IsRegex()メソッドと比較することができます。

例は

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

だろう部品番号の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); 
} 
関連する問題