5

Match.CreateMoqを使用すると、奇妙な動作が発生します。

Match.Create変数として抽出すると、次のコード スニペットが渡されません。

      var mock = new Mock<IA>();
      mock.Object.Method ("muh");
      mock.Verify (m => m.Method (Match.Create<string> (s => s.Length == 3)));

      public interface IA
      {
        void Method (string arg);
      }

理由は何ですか?

4

3 に答える 3

8

お二人ともありがとう。しかし、これに対する別の良い解決策を見つけました。説明したクイック スタートのように、メソッドを使用することもできます。最初は、変数を使ってもメソッドを使っても変わらないだろうと思っていました。しかし明らかに、Moq は十分に賢いです。したがって、式と述語は次のように変換できます。

public string StringThreeCharsLong ()
{
  return Match.Create<string> (s => s.Length == 3);
}

単体テストのノイズを減らすので、これは素晴らしいと思います。

MyMock.Verify (m => m.Method (StringThreeCharsLong());
于 2013-01-14T21:29:56.050 に答える
5

抽出しすぎです。述語で十分です:

var mock = new Mock<IA>();
Predicate<string> isThreeCharsLong = s => s.Length == 3;
mock.Object.Method("muh");
mock.Verify(m => m.Method(Match.Create<string>(isThreeCharsLong)));

または、同じ効果で構文を少し短くするためにIt.Is、式パラメーターを指定してマッチャーを使用できます。

var mock = new Mock<IA>();
Expression<Func<string, bool>> isThreeCharsLong = s => s.Length == 3;
mock.Object.Method("muh");
mock.Verify(m => m.Method(It.Is<string>(isThreeCharsLong)));
于 2013-01-14T21:17:43.323 に答える
4

編集:あなたの質問が間違っていました、もう一度:

問題はMatch.Create<string> (s => s.Length == 3);、文字列を返すことです。.Verify()通話中にのみ使用できます。変数を抽出するとIt.Is<string>(Expr)、それは単純な System.String として渡され、verify はそれを値としてチェックします (その値は単に String.Empty になるため失敗します)。

var mock = new Mock<IA>();

//this will be a string, and contain just ""
var yourMatcher = Match.Create<string> (s => s.Length == 3);

mock.Object.Method ("muh");

//this will fail because "muh" != ""
mock.Verify (m => m.Method (yourMatcher));

public interface IA
{
  void Method (string arg);
}
于 2013-01-14T20:22:21.940 に答える