Moq你如何测试内部方法?

老板告诉我使用Moq,就是这样。 我喜欢它,但它似乎不像MSTest或mbunit等…你无法测试内部方法

所以我被迫在我的界面中公开一些内部实现,以便我可以测试它。

我错过了什么吗?

你能用Moq测试内部方法吗?

非常感谢

使内部对其他类可见以进行测试没有任何问题。 如果你需要测试一个类的内部,一定要这样做。 仅仅因为这些方法不公开并不意味着你应该忽略它们并仅测试公共方法。 一个设计良好的应用程序实际上将大部分代码封装在您的类中,使它们不公开。 所以在你的测试中忽略非公开方法是一个很大的错误恕我直言。 unit testing的一个优点是你测试代码的所有部分,无论多小,当你的测试都以100%运行时,这是一个非常合理的假设,当所有这些部分放在一起时,你的应用程序将适用于最终用户。 当然,validation后一部分是集成级别测试的来源 – 这是一个不同的讨论。 所以试试!!!

如果您有许多未经公共方法测试的代码,则可能需要将代码移动到其他类。

如在另一个答案中所述,您可以使用InternalsVisibleTo属性。 但这并不意味着你应该这样做。

从我的观点来看,应该使用模拟来模拟我们依赖但尚未开始测试的一些行为。 因此:

问:我错过了什么吗? – 不,你没有遗漏任何东西,MOQ缺乏模仿私人行为的能力。

问:你能用Moq测试内部方法吗? – 如果私有行为的结果是公开显示的,那么您可以测试内部方法,但不是因为Moq可以测试它们。 我想说明一点,Mock不是测试的能力,而是我们没有测试但依赖的类似行为的能力。

C:TDD的一个主要好处是您的代码变得易于更改。 如果你开始测试内部,那么代码变得僵硬并且难以改变 – 我不同意这个评论有两个主要原因:1:这不是初学者的误解,因为TDD不仅仅是关于编码速度更快的能力还有更好的质量代码。 因此,我们可以做得越多越好。 2:如果你能以某种方式测试内部方法,它不会使代码更难以改变。

您最初的假设是有必要测试内部方法是一个常见的初学者对unit testing的误解。

当然,可能存在私有方法应该单独测试的情况,但99%的常见情况是私有方法被隐式测试,因为它们使公共方法通过了测试。 公共方法调用私有方法。

私人方法是有原因的。 如果它们不会导致外部可测试行为,那么您不需要它们。

如果你只是删除它们,你的任何公共测试都会失败吗? 如果是,那么它们已经在测试中。 如果没有,那你为什么需要它们呢? 找出你需要它们,然后在针对公共接口的测试中表达它。

TDD的一个主要好处是您的代码变得易于更改。 如果您开始测试内部,那么代码将变得僵硬且难以更改。

InternalsVisibleTo是您测试内部的朋友。 记得签署你的assembly,你是安全的。