2017-01-04 67 views
2

当使用.Net核心框架编译时,最新的xunit框架不允许库代码中的测试运行程序(这适用于普通的Visual Studio代码)。解决方案是创建一个单独的测试项目来运行测试用例。.Net核心库:如何使用xUnit测试私有方法

我遇到的问题是我想测试的一些方法是'私有'方法。 如何从我的测试项目中调用这些方法而不将它们的范围设为“公开”?

更一般的问题是:当使用私有方法的公共方法无法使用时,如何测试私有方法?(因为它的互动性的 - 也就是说,它具有的ReadLine();其中包含的)


可能的解决方案:
1)使私有方法公共和方式,以将其重命名表明它们不应该在外部使用。 (使用'private'或'internal'作为名称的一部分)
2)创建一个'public static bool Testflag'字段,该字段可以设置为true以避开公共方法的交互部分以确保测试所有其部分。

(虽然我已经使用上述两种方法 - ?我真的不喜欢它,因为私有方法应该保密和标志添加额外的复杂性,很多已经有人遇到了同样的问题,你是怎么解决它

+7

这个问题的一般答案是将交互部分视为服务并将其隐藏在接口后面(您可能称为“IInputRequester”或类似接口)。然后,您的单元测试可以通过该接口的模拟实现('MockInputRequester'),而您的生产代码可以传递该接口的实际实现('ConsoleInputRequester')。请注意,这不仅仅是你为单元测试做的事情。这是制作[SOLID](https://en.wikipedia.org/wiki/SOLID_(object-oriented_design))设计的标准部分。 –

+0

看起来公共方法与执行问题紧密相关,这使得测试变得困难。这表明设计需要重构。 (代码味道) – Nkosi

回答

9

一个快速的解决方案是让你想测试internalprivate成员。

然后,您可以添加一个InternalsVisibleTo属性到您的主图书馆的AssemblyInfo.cs中。这将使你的测试库(并且没有其他库,而反射)访问主库中的内部方法/类。

例如

[assembly: InternalVisibleTo("Library.Tests")] 
相关问题