Moq - 模拟多个参数

6

Moq页面中我尝试的一半链接都是失效的,包括官方API文档的链接。因此,我会在这里提问。

我成功地使用了一个单一的“catch all”参数,如下所示:

mockRepo.Setup(r => r.GetById(It.IsAny<int>())).Returns((int i) => mockCollection.Where(x => x.Id == i).Single());

然而,我无法弄清如何使用多个参数来实现相同的行为。

mockRepo.Setup(r => r.GetByABunchOfStuff(It.IsAny<int>(), It.IsAny<string>(), It.IsAny<int>())).Returns( ..... );

我无法理解的部分是...


针对Jordan的编辑:

问题在于如何表示三个参数,而不仅仅是一个。

如何转换:

(int i) => mockCollection.Where(x => x.Id == i)

into:

(int i), (string s), (int j) => mockCollection.Where(x => x.Id == i && x.SomeProp == s && x.SomeOtherProp == j)

“Returns” 应该与第一个案例的相同。你遇到了什么问题? - Jordan Kaye
4个回答

8

与单个参数几乎相同:

.Returns
      (
         (int i, string s, int x) 
                => mockCollection.Where
                     (
                             x => x.Id == i 
                          && x.SomeProp == s 
                          && x.SomeOtherProp == x
                     )
      );

或者使用通用的返回变体:
.Returns<int, string, int>
     (
          (i, s, x) 
               => mockCollection.Where
                    (
                         x => x.Id == i 
                         && x.SomeProp == s 
                         && x.SomeOtherProp == x
                    )
     );

FML...第一个是我正在寻找的。其他符号也很好了解,谢谢。 - Terry

6
我认为你需要的是:

我认为您需要的是:

   mockRepo
       .Setup(r => r.GetByABunchOfStuff(It.IsAny<int>(), It.IsAny<string>(), It.IsAny<int>()))
       .Returns<int,string,int>((id, someProp, someOtherProp) =>
           mockCollection.Where(x => x.Id == i && x.SomeProp == s && x.SomeOtherProp == x));

2
你是指如何编写正确的lambda表达式吗?
mockRepo.Setup(r => r.GetByABunchOfStuff(It.IsAny<int>(), It.IsAny<string>(), It.IsAny<int>()))
        .Returns((int i, string s, int i2) => doSomething() );

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接