我可以通过It.Is <>传递给另一个方法来设置模拟吗?

NibblyPig

我有这个:

myObj.SetupSomething(It.IsAny<string>());

然后在MyObj类中:

public void SetupSomething(string s)
{
  _someMock.Setup(c => c.DoWibble(s));
}

上面的代码不起作用,因为It.IsAny<>通过null它来设置它null而不是任何字符串。如果我用这个替换它:

  _someMock.Setup(c => c.DoWibble(It.IsAny<string>()));

然后就可以了。所以我想知道,是否可以将It.IsAny<string>()through的表达式传递给我的方法,以便Moq仍能识别我在做什么,还是我需要做一个额外的SetupSomethingForAnyString()方法(有点讨厌)?

杰夫·达米耶

如您所见,简单的答案是“否”,不可能仅将原始It.IsAny<string>()结果作为参数传递给设置。但这还不是故事的结局。Moq如何检测表达式自变量并将其转换为匹配器,这在实际执行过程中提供返回值时最终会用到一些难以置信的细微差别。如果您有时间,我绝对建议您看一看源代码。那里发生了一些很酷的体操运动-不仅仅是表情树分析。

在最基本的层次上,在It.IsAny<string>()设置之外用作参数不起作用的原因与执行顺序有关。考虑:

var x = It.IsAny<string>();
mock.Setup(m => m.DoWibble(x));

mock.Setup(m => m.DoWibble(It.IsAny<string>()));

首先,它It.IsAny<string>()是在任何模拟上下文之外进行评估的,而在模拟上下文之外,该库实际上无法返回有意义的值,因此它只返回default(T)然后将该空值绑定为一个变量,该变量在带引号的lambda表达式中捕获m => m.DoWibble(x)

整个表达式都传递给该Setup方法,Moq库将部分评估为参数提供的表达式,包括捕获的值“ x”。当前值为default(string),因此它将设置一个匹配器,该匹配器仅在传递空值时才起作用。

在第二个中,引用的表达式现在包括整个m => m.DoWibble(It.IsAny<string>())调用。现在,当Moq部分执行时It.IsAny<string>(),它可以在上下文中与观察者合作执行副作用,从而通知Moq库为该参数创建“ any”匹配器。

但这意味着MoqIt.IsAny即使未作为原始引用的lambda的一部分直接调用,也可以检测到对方法的调用。这意味着它也可以正常工作:

Func<string> callIsAny = () => It.IsAny<string>();
mock.Setup(m => m.DoWibble(callIsAny.Invoke()));

这里的关键是It.IsAny<string>()在设置之前实际上并未在语句中调用,而是仅在Moq分析模拟方法的参数时才进行评估。并且由于它设置了一个检测上下文来查看何时It.IsAny调用,因此可以为这种情况正确地创建匹配器。

请注意,Moq使用指南中的任何地方均未对此进行记录,因此我不确定是否可以使用此功能。It.IsAny的检测上下文可能仅打算用于设置事件处理程序。但这当然很酷!


相反,如果您实际上想通过一些间接层传递参数匹配器,则最好利用Moq:中已经存在的功能It.Is

它将被定义为:

public void SetupSomething(Expression<Func<string, bool>> stringMatcher)
{
   _someMock.Setup(m => m.DoWibble(It.Is(stringMatcher)));
}

像这样使用:

myObj.SetupSomething(_ => true); // match anything
myObj.SetupSomething(s => s == "a"); // match only calls with "a";

它不像使用普通It.IsAny调用那样可读,但是您可以通过将自己的匹配器lambda作为属性或方法调用(例如Match.Any<string>()来缓解这种情况

到那时,看上去好像重新实现了Moq的领域语言。是否值得付出努力取决于您。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以通过在 c 中同时索引两个矩阵来将矩阵的值传递给另一个矩阵吗?

来自分类Dev

是否可以制作一个方法来设置作为参数传递给它的Property的值?

来自分类Java

可以通过Java中的另一个线程修改传递给函数的列表吗?

来自分类Dev

指针值可以仅通过传递给另一个函数来更改吗?

来自分类Dev

我可以将一个函数和不同数量的参数传递给另一个函数吗?

来自分类Dev

我可以将对象或值从一个rake任务传递给另一个吗?

来自分类Dev

java easymock:调用模拟时我可以调用另一个方法吗?

来自分类Dev

通过从另一个类调用方法来更新信息

来自分类Dev

是否可以将一个方法传递给另一个方法?

来自分类Dev

我可以通过加入它们来在另一个 CTE 中使用 CTE 数据吗 (Oracle SQL)

来自分类Dev

我可以代理将根传递给一个地址,其余的传递给 nginx 中的另一个地址吗?

来自分类Dev

有没有一种跨平台的方法来检查stdout是否通过管道传递到Rust中的另一个程序中?

来自分类Dev

AnimationController:我们可以将TickerProvider vsync传递给另一个类吗?

来自分类Dev

我可以使用lambda调用将路径参数传递给另一个lambda函数吗?

来自分类Dev

我可以在 Classic ASP/VB 中使用另一个变量来设置数组变量的限制吗?

来自分类Linux

我可以打开一个套接字并将其传递给Linux中的另一个进程吗

来自分类Dev

我可以将一个函数传递给另一个函数,该函数调用具有依赖性的函数吗?

来自分类Dev

如何通过将另一个NULL值传递给列的另一个表来创建表?

来自分类Dev

Swift:是否可以将另一个类的静态属性传递给方法?

来自分类Dev

我可以通过JIL在Autosys的另一个Box作业中创建一个Box作业吗?

来自分类Dev

React Native 问题 - 通过从构造函数调用另一个方法来初始化状态

来自分类Dev

如何通过从另一个类调用方法来初始化final字段?

来自分类Dev

我可以访问另一个方法中的一个方法吗?

来自分类Dev

我可以使用变量模板来声明另一个变量模板吗?

来自分类Dev

我可以通过在该对象中使用另一个值来获得该对象内部的特定值吗?

来自分类Dev

我们如何通过选择表中基于选择的表行来将不同的值传递给另一个活动

来自分类Dev

如何通过按 ctrl+c 停止一个方法并自动启动另一个方法来执行

来自分类Dev

R:通过设置其他参数,将多个参数中的一个作为一个参数传递给另一个函数

来自分类Dev

我可以选择通过另一个不唯一的元素获取表的主键吗?

Related 相关文章

  1. 1

    我可以通过在 c 中同时索引两个矩阵来将矩阵的值传递给另一个矩阵吗?

  2. 2

    是否可以制作一个方法来设置作为参数传递给它的Property的值?

  3. 3

    可以通过Java中的另一个线程修改传递给函数的列表吗?

  4. 4

    指针值可以仅通过传递给另一个函数来更改吗?

  5. 5

    我可以将一个函数和不同数量的参数传递给另一个函数吗?

  6. 6

    我可以将对象或值从一个rake任务传递给另一个吗?

  7. 7

    java easymock:调用模拟时我可以调用另一个方法吗?

  8. 8

    通过从另一个类调用方法来更新信息

  9. 9

    是否可以将一个方法传递给另一个方法?

  10. 10

    我可以通过加入它们来在另一个 CTE 中使用 CTE 数据吗 (Oracle SQL)

  11. 11

    我可以代理将根传递给一个地址,其余的传递给 nginx 中的另一个地址吗?

  12. 12

    有没有一种跨平台的方法来检查stdout是否通过管道传递到Rust中的另一个程序中?

  13. 13

    AnimationController:我们可以将TickerProvider vsync传递给另一个类吗?

  14. 14

    我可以使用lambda调用将路径参数传递给另一个lambda函数吗?

  15. 15

    我可以在 Classic ASP/VB 中使用另一个变量来设置数组变量的限制吗?

  16. 16

    我可以打开一个套接字并将其传递给Linux中的另一个进程吗

  17. 17

    我可以将一个函数传递给另一个函数,该函数调用具有依赖性的函数吗?

  18. 18

    如何通过将另一个NULL值传递给列的另一个表来创建表?

  19. 19

    Swift:是否可以将另一个类的静态属性传递给方法?

  20. 20

    我可以通过JIL在Autosys的另一个Box作业中创建一个Box作业吗?

  21. 21

    React Native 问题 - 通过从构造函数调用另一个方法来初始化状态

  22. 22

    如何通过从另一个类调用方法来初始化final字段?

  23. 23

    我可以访问另一个方法中的一个方法吗?

  24. 24

    我可以使用变量模板来声明另一个变量模板吗?

  25. 25

    我可以通过在该对象中使用另一个值来获得该对象内部的特定值吗?

  26. 26

    我们如何通过选择表中基于选择的表行来将不同的值传递给另一个活动

  27. 27

    如何通过按 ctrl+c 停止一个方法并自动启动另一个方法来执行

  28. 28

    R:通过设置其他参数,将多个参数中的一个作为一个参数传递给另一个函数

  29. 29

    我可以选择通过另一个不唯一的元素获取表的主键吗?

热门标签

归档