【发布时间】:2019-04-03 14:39:49
【问题描述】:
替代标题:这些表达是什么意思?
编辑:This post 几乎有所帮助,但只是解释了两个设置函数之间的区别,而不是如何阅读它们。
我正在学习如何使用最小起订量并为我的团队进行基础培训,在经历了this video 和查找other stackoverflow posts(以及其他)之后,我认为我理解它足以使用它,但仅在“这就是它的完成方式”的意义上。我没有理由或能力来解释语法。请帮忙。
为了记录,我理解 C# 模板、表达式、函数、动作和事件的单独使用,但是将它们混合在一起?元是真实的。
考虑以下来自视频演示单元测试之一的代码 sn-p,Should_Mock_Events_Based_On_Action()(unit test source,IRepo source):
var mockRepo = new Mock<IRepo>();
mockRepo.Setup(x => x.AddRecord(null))
.Raises(m => m.FailedDatabaseRequest += null, this, EventArgs.Empty);
Setup(...)函数似乎是这样写的:“设置一个接受IRepo的函数,然后使用null调用AddRecord(...)。”但是这个设置是在模拟IRepo.AddRecord(...),这不是一个表达式。不知何故,这在模拟中被翻译为“为IRepo设置一个名为AddRecord(...)的函数,这样,当它使用null时,它会以某种方式运行。”但它不是这样读的。 这应该怎么读?不知何故,表达式在某个地方变成了一个实际的函数调用。Raises(...)函数真的让我很困惑。它看起来像是在说:“之前设置的函数引发了一个事件,该事件接受IRepo并将null添加到其事件处理程序中。”而且......不知何故,这使得事件发生?+= null操作没有返回任何内容,我无法弄清楚如何将其理解为该处理程序正在寻找的事件。我发现许多文章和 SO 帖子表明这就是它的完成方式,但没有一篇(我还没有找到)解释为什么。 这应该怎么读?
【问题讨论】:
-
当使用
null参数调用 AddRecordIRepo.AddRecord方法时,它会使用空事件参数EventArgs.Empty引发事件FailedDatabaseRequest。 -
我看到它确实如此,但我发现语法和它的作用之间几乎没有相关性
-
我认为也许您应该花一些时间学习匿名函数和 LINQ。来到 Moq 了解这些,我发现语法非常明显和清晰 - 但从您的问题和 cmets 看来,您似乎并不了解将函数作为参数传递是如何工作的。在您明白这一点之前,我几乎无能为力 - 知道如何将函数作为参数传递是使用 Moq 的基础。
-
@MattJones :我认为我了解它们是如何工作的,但我不知道它是如何被调用的。在单元测试的任何部分都没有I调用匿名函数,但它显然被调用somewhere。假设我将一个表达式传递给一个函数。怎么办?在被调用之前它什么都不做。那么起订量如何称呼它以及何时?
-
我深入研究了一下,发现我的困惑源于不理解 C# 的
Expression<>。我的问题不是匿名函数、LINQ 或 lambda,而是不知道 C# 可以将表达式解构为它们的基本部分的表达式树,然后在运行时用其他东西构造等效的功能。凉爽的。不过还是感谢您的 cmets。
标签: c# unit-testing moq