如何类访问在另一个会单元测试的目的?
-
06-07-2019 - |
题
我跳进的单元测试这些工作室2008年的方式,并且我想知道什么是最好的方式来完成的交会 class
访问测试的目的。
基本上,我有两个项目中的一个解决方案:
- MyProject(C#)
- MyProjectTests(C#试验项目)
一切都在MyProject目前已经默认无障碍的,如果我记忆正确意味着一切都是有效的 internal
.我主要是想要测试的 class
水平,但也有一些 delegates
参与。
有可能会被外部API在未来的某个时候,但我大约20%的办法,以功能完整的(至少在纸上)和我变得相当持怀疑态度的分层代码顶上的这个未经试验的核心。因此,我想现在做一些测试之前的程序是完全不够用传统的(阅读:坏和/或懒惰的)功能测试和确定地前的版本n+1个外API。
此外,一个直接的答案,例的解决方案将是极大的赞赏。
解决方案
您可以使用程序集级属性 InternalsVisibleToAttribute 实现这一目标。
添加
[assembly:InternalsVisibleTo("MyProjectTests")]
到MyProject程序集中的AssemblyInfo.cs。
其他提示
您可以通过向主项目的AssemblyInfo.cs添加属性来测试内部方法,从而可以访问命名程序集的内部方法:
[组件:InternalsVisibleTo(QUOT; MyProjectTestsNameSpace.MyProjectTests&QUOT)]
更多信息,请此处
您需要添加
[assembly:InternalsVisibleTo("Unit.Tests.Assembly")]
到你的“MyProject(C#)”的AssemblyInfo.cs。然后,您的测试可以访问内部测试方法。
看起来你需要 InternalsVisibleToAttribute
但是我建议不要采用这种方法 - 通过公共接口或API测试你的内部类。
虽然 [InternalsVisibleTo]
是最明智的办法国际海事组织,至少存在2个其他方式去这样的:
通过使用 反射
var method = instance.GetType().GetMethod( methodName, BindingFlags.NonPublic | BindingFlags.Instance, null, paramTypeArray, null); return method.Invoke(instance, parameters);
这种方法的问题是,如果方法的名称或签名的变化,该单元的测试将开始未能在运行时间,而 [InternalsVisibleTo]
会很容易地被拿起这种裂变化在编译时间。
- 使用一个测试框架喜欢
Moles / Fakes
或TypeMock
我发现这个 https://msdn.microsoft.com/en-us/library/hh598957.aspx 希望它能帮助别人。
摘要:
- 在你的单元试验项目,增加一个参考代码进行测试。这里是如何创建的参考代码项目在同一解决方案:
- 选择项目在解决方案。
- 该项目的菜单中选择加入参考。
- 在参考经理对话框中打开解决方案的节点和选择项目。
- 检查代码项目名称和密切的对话框。