如何访问另一个程序集中的类以进行unit testing?
我正在开始对Visual-Studio 2008方式进行unit testing,我想知道为了测试目的,完成跨程序集class
访问的最佳方法是什么。
基本上,我在一个解决方案中有两个项目:
- MyProject(C#)
- MyProjectTests(C#测试项目)
MyProject中的所有内容当前都具有默认的可访问性,如果我没记错,这意味着一切都是internal
。 我主要想在class
上进行测试,但是有一些delegates
参与其中。
将来某个时候可能会有一个外部API,但我大约有20%的function完整(至少在纸面上)并且我非常谨慎地在这个未经测试的核心上层叠更多代码。 因此,我想在应用程序完成足够传统(读取:坏和/或懒惰)function测试之前完成一些测试,并且肯定在版本n + 1外部API启动之前完成。
除了直接的答案,我们将非常感谢解决方案的一个例子。
您可以使用程序集级属性InternalsVisibleToAttribute来实现此目的。
加
[assembly:InternalsVisibleTo("MyProjectTests")]
到MyProject程序集中的AssemblyInfo.cs。
您可以通过向主项目的AssemblyInfo.cs添加属性来测试内部方法,从而可以访问命名程序集的内部方法:
[组件:InternalsVisibleTo( “MyProjectTestsNameSpace.MyProjectTests”)]
更多信息在这里
你需要添加
[assembly:InternalsVisibleTo("Unit.Tests.Assembly")]
到你的“MyProject(C#)”的AssemblyInfo.cs。 然后,您的测试可以访问内部测试方法。
看起来你需要InternalsVisibleToAttribute
但是我建议不要使用这种方法 – 通过公共接口或API测试你的内部类。
尽管[InternalsVisibleTo]
是IMO最明智的方式,但至少还有其他两种方法:
-
通过使用reflection
var method = instance.GetType().GetMethod( methodName, BindingFlags.NonPublic | BindingFlags.Instance, null, paramTypeArray, null); return method.Invoke(instance, parameters);
这种方法的问题在于,如果方法名称或签名发生变化,unit testing将在运行时开始失败,而[InternalsVisibleTo]
在编译时很容易被这个重大变化所取代。
- 使用像
Moles / Fakes
TypeMock
或TypeMock
这样的测试框架
我找到了这个https://msdn.microsoft.com/en-us/library/hh598957.aspx希望它可以帮助某人。
摘要:
- 在unit testing项目中,添加对测试代码的引用。 以下是在同一解决方案中创建对代码项目的引用的方法:
- 在Solution Explorer中选择项目。
- 在项目菜单上,选择添加引用….
- 在“参考管理器”对话框中,打开“解决方案”节点并选择“项目”
- 检查代码项目名称并关闭对话框。
- 从构建输出中省略本地化版本的程序集
- ‘无法加载文件或程序集’netstandard,Version = 2.0.0.0,…’。 不应加载引用程序集以执行
- 对于同一.NET库的不同目标框架版本,程序集guid属性是否有所不同?
- ‘/’应用程序中的服务器错误。 System.Web.Http.WebHost
- 使用星号时导致Assembly Version递增的原因是什么?
- 如何在DNX Core 5.0(ASP.NET 5)中引用执行程序集?
- 如果语句似乎正在评估,即使条件评估为false
- microsoft.visualbasic.fileio不存在
- 如何使用ICLRStrongName :: StrongNameSignatureVerificationEx方法识别延迟签名的程序集