web-dev-qa-db-ja.com

Moqを使用して、期待されるプロパティ値を持つオブジェクトとして入力パラメーターを使用してメソッド呼び出しを設定するにはどうすればよいですか?

 var storageManager = new Mock<IStorageManager>(); 
 storageManager.Setup(e => e.Add(It.IsAny<UserMetaData>()));

Add()メソッドは、FirstNameプロパティを持つUserMetaDataオブジェクトを想定しています。

「FirstName1」というFirstNameを持つUserMetaData型のオブジェクトが渡されたことを確認したいと思います。

32
The Light

Verifyを使用できます。

例:

AddUserMetaDataが呼び出されたことがないことを確認しますFirstName!= "FirstName1"で:

storageManager.Verify(e => e.Add(It.Is<UserMetaData>(d => d.FirstName!="FirstName1")), Times.Never());

AddUserMetaDataが少なくとも1回呼び出されたことを確認しますFirstName == "FirstName1"で:

storageManager.Verify(e => e.Add(It.Is<UserMetaData>(d => d.FirstName=="FirstName1")), Times.AtLeastOnce());

AddFirstName == "Firstname1"およびLastName == "LastName2"で1回だけ呼び出されたことを確認します。

storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1"
                                                         && data.LastName  == "LastName2")));

...

storageManager.VerifyAll();
49
sloth

It.Isメソッドを使用できます:

storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1")));
11
MatthiasG

Dominic Kexelの方法は優れており、機能します。また、コールバックを使用することもできます。これは、より複雑な出力のチェックを行う必要がある場合に便利です。

 UserMetaData parameter = null;
 var storageManager = new Mock<IStorageManager>(); 
 storageManager
    .Setup(e => e.Add(It.IsAny<UserMetaData>()))
    .Callback((UserMetaData metaData) => parameter = metaData);

 Assert.That(parameter.FirstName, Is.EqualTo("FirstName1")); //If using fluent NUnit

これの利点は、必要に応じて、単に「FirstName1」であることを確認するのではなく、パラメーターに対してさらに多くの確認を実行できることです。

欠点は、Addが複数回呼び出された場合、最後の呼び出しで渡されたパラメーターのみがチェックされることです(追加で1回呼び出されたことを確認できます)。

ドミニクの答えはあなたの正確な状況では私のものよりも優れていますが、他の同様の状況ではコールバックを指摘したかったです。

8
Andy Nichols