0

moq を使用した単体テストを行うのに少し問題があります。

次のような関数がある場合:

public string GetName(IMapinfoWrapper wrapper)
{
   return wrapper.Evaluate("My com command");
   ///"My comm command" is the same all the time.
}

次に、GetName 関数の戻り値をチェックするテストがあります。

[Test]
public void Test()
{
  Mock<IMapinfoWrapper> mock = new Mock<IMapinfoWrapper>();
  mock.Expect(mapinfo => mapinfo.Evaluate(It.IsAny<String>()))
      .Returns("TableName");

  Assert.AreEqual("TableName", GetName(mock.object));
}

したがって、私の質問は、モックを次のように定義する必要があることです。

mock.Expect(mapinfo => mapinfo.Evaluate(It.IsAny<String>()))
    .Returns("TableName");

またはこのように:

mock.Expect(mapinfo => mapinfo.Evaluate("My com command")
    .Returns("TableName");

2 番目の方法を使用することに関する私の唯一の問題は、メソッド GetName の実装を結び付けて、常に "My com command" 文字列を内部的に使用しているように感じることです。

これは私がやるべきことですか、それとも私はこれをすべて間違っていますか?
単体テストとモックを始めたばかりなので、すべてをどのように連携させるべきかまだわかりません。

4

1 に答える 1

3

実際に何をテストしているかによって異なります。

Evaluate に渡された文字列が "TableName" を返すことが予想される場合は、IsAny への呼び出しを使用します。

それ以外の場合、「My com コマンド」を渡す場合のように、特定の入力が与えられたときに特定の出力が期待される場合は、2 番目を渡します。

特定の入力を探しているのではなく、(この場合)基本的な健全性チェックを行っているように見えるので、前者が正しい動きであると言えます(この場合も、より具体的なケースが必要ですその使用例)。

于 2009-01-30T05:56:00.050 に答える