Using Moq, how do I set up a method call with an input parameter as an object with expected property values?

╄→尐↘猪︶ㄣ 提交于 2020-01-11 17:09:29

问题


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

The Add() method expects a UserMetaData object which has a FirstName property.

I'd like to make sure that an object of type UserMetaData with the FirstName of "FirstName1" has been passed.


回答1:


You can use Verify.

Examples:

Verify that Add was never called with an UserMetaData with FirstName!= "FirstName1":

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

Verify that Add was called at least once with an UserMetaData with FirstName== "FirstName1":

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

Verify that Add was called exactly once with FirstName == "Firstname1" and LastName == "LastName2":

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

...

storageManager.VerifyAll();



回答2:


You can use the It.Is method:

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



回答3:


Dominic Kexel's method is good and will work. You can also use callback though which is useful if you need to do any checking of the output that is more complicated.

 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

The advantage of this is that, if required, you can do many more checks on the parameter rather than just checking that it is "FirstName1".

The disadvantage is that if Add is called multiple times then only the parameter passed in the last call will be checked (although you can additionally Verify that it was called once).

Dominic's answer is better than mine for your precise situation but I wanted to point out Callback for other similar situations.



来源:https://stackoverflow.com/questions/15879260/using-moq-how-do-i-set-up-a-method-call-with-an-input-parameter-as-an-object-wi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!