Moq你如何测试内部方法?

时间:2009-09-22 05:43:45

标签: c# .net moq

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

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

我错过了什么吗?

您可以使用Moq测试内部方法吗?

非常感谢

6 个答案:

答案 0 :(得分:11)

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

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

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

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

答案 4 :(得分:1)

您最初的推测是,有必要测试内部方法是一个常见的初学者对单元测试的误解。

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

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

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

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

答案 5 :(得分:1)

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