5

我在 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( ..... );

....是我无法弄清楚的部分。


编辑回应乔丹:

问题是如何表示 3 个参数而不仅仅是一个。

怎么转:

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

进入:

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

4 回答 4

7

这与使用单个参数几乎相同:

.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
                    )
     );
于 2012-10-01T19:24:24.907 回答
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));
于 2012-10-01T19:28:36.150 回答
2

你的意思是你怎么写正确的lambda?

mockRepo.Setup(r => r.GetByABunchOfStuff(It.IsAny<int>(), It.IsAny<string>(), It.IsAny<int>()))
        .Returns((int i, string s, int i2) => doSomething() );
于 2012-10-01T19:32:20.777 回答
0

请参阅 Mark Seeman 对此问题的回答:

在 Moq Callback() 调用中设置变量值

它可能会有所帮助。

于 2012-10-01T19:32:38.000 回答