web-dev-qa-db-ja.com

ユニットモックテストのit.isAnyとは何ですか?

これについてはすでに多くの質問が寄せられていますが、私はTDDの初心者なので、この概念をクリアできるもっと基本的なものが必要だと思います。それまでは先に進めません。

次のテスト方法を実行して、私が間違った理解をしている場合は説明してください。

_[Test]
public void ShouldSearch()
{
         var ColumnList = new List<Column>();
_

以下の行は、私がオブジェクトをモックしていることを意味します。

しかし、このIt.IsAny<>()はここで何を意味するのでしょうか?

_ this.ColumnServiceMock.Setup(x => x.GetColumn(It.IsAny<Context>(), It.IsAny<Column>()))
                       .Returns(ColumnList);

 var result = this.getColouminfo.GetFinalRecords(this.context, this.gridColumn);

 this.ColumnServiceMock.Verify(x => x.GetColumn(It.Is<Context>(y => y == this.context),
 It.Is<Column>(y => y.Id == 2)), Times.Once);

  Assert.AreEqual(1, result.Data.Count, "Not equal");

  Assert.IsTrue(result.Data.Success, "No success");
_
8
Sweetie

_It.IsAny<T>_は、パラメーターがT型であることを確認しています。これは、T型の任意のインスタンスである可能性があります。基本的には、T型である限り、ここで何を渡してもかまいません。

this.ColumnServiceMock.Setup(x => x.GetColumn(It.IsAny<Context>(), It.IsAny<Column>())).Returns(ColumnList);

上記は、GetColumnメソッドが任意のパラメーターで呼び出されるたびに(それぞれContextおよびColumnのタイプである限り)、ColumnListを返すことを示しています。 。

_It.Is<T>_を使用すると、渡されたものを検査し、渡されたパラメーターがニーズを満たしているかどうかを判断できます。

this.ColumnServiceMock.Verify(x => x.GetColumn(It.Is<Context>(y => y == this.context), It.Is<Column>(y => y.Id == 2)), Times.Once);

上記は、GetColumnメソッドが1回だけ呼び出され、Contextパラメーターが_this.Context_に等しく、ColumnパラメーターのIdプロパティが2に等しいことを示しています。

編集:もう少し知識を持って数年後にこの答えを再検討します。 this.ColumnServiceMock.Verify(x => x.GetColumn(It.Is<Context>(y => y == this.context), It.Is<Column>(y => y.Id == 2)), Times.Once);this.ColumnServiceMock.Verify(x => x.GetColumn(this.context, It.Is<Column>(y => y.Id == 2)), Times.Once);に短縮できます。 Itを使用する必要はありません。参照が等しいかどうかを確認するために、オブジェクトを直接渡すことができます。

13
ChrisO

It.IsAny<T>()は、そのタイプのものをすべて指定します。

It.Is<T>()はより具体的であり、それが正確に一致することを確認するためにラムダを取ります。

どちらも、モック時に正確に指定したくない引数を指定する方法にすぎません。したがって、たとえば、引数が文字列名であり、テストで正確な名前を気にしない場合は、次のように使用できます。

模擬仕様のIt.IsAny<string>()。これは任意の文字列に一致します。

名前を常に「S」で始めたい場合は、次のことができます。

It.IsAny<string>(x => x.StartsWith("S"))これはSで始まる文字列にのみ一致します。

5
gmn