具有接受对象列表的函数的Moq设置,如何定义可以接受的对象ID?

时间:2018-05-24 07:59:31

标签: c# unit-testing moq

我有以下Moq服务。其中一个函数接受各种参数,但其中一个是List<MyObject>,其中MtObject具有Id。我试图定义Moq应该接受的实际对象,以便返回我想要为该对象返回的内容,但它不起作用 - 没有返回任何内容 - 我想知道是否因为提供的对象不是我们调用Moq服务时使用的确切对象 - 所以我将尝试在设置中指定MyObject.Id,但我无法弄清楚如何操作。

这是我原来的:

myService.Setup(s => s.GetSomeStuff(
    It.IsAny<Reference>(),
    new List<MyObject>() { fakeMyObject1, fakeMyObject2 },
    anotherThing,
    number))
.Returns(MyResponse).Verifiable();

上面的回复null,如果我使用It.IsAny<List<MyObject>>(),那么我会收到回复,但我需要根据传入的MyOject获得不同的回复。

为了指定fakeObject1.IdfakeObject2.Id而不是对象,我应该替换此行?

new List<MyObject>() { fakeMyObject1, fakeMyObject2 }

或者您认为原始解决方案应该有效吗?或者还有另一种选择吗?

1 个答案:

答案 0 :(得分:2)

  

我想知道是否因为提供的对象不是我们调用Moq服务时使用的确切对象

这是正确的。因为参数实例与模拟不匹配,所以不会按预期运行。

It.Is<T>()参数匹配器与谓词匹配,以匹配所需的ID

 myService.Setup(_ => _.GetSomeStuff(
    It.IsAny<Reference>(),
    It.Is<List<MyObject>>(x => 
        x.Any(y => y.Id == fakeObject1.Id || y.Id == fakeObject2.Id) //<-- or something else
    ),
    anotherThing,
    number))
.Returns(MyResponse)
.Verifiable();

参考Moq Quickstart: Matching Arguments