在工作中经常会碰到类似的情况:我写了个功能模块,现在需要对它进行单元测试,功能模块在某个程序集中,而我的单元测试却在另外一个程序集中。功能模块是对外的,接口上当然是有很严整的访问权限,而单元测试也许需要调用到一些Internal的类或者方法。我们会怎么做呢?VS2003之前,我只好用type.InvokeMember来做。但是也存在很多的问题,当功能模块中的接口发生了变化(要知道,对内接口可是很容易就Rename的),那么在编译阶段,单元测试通过了,运行却出错了,我们辛辛苦苦发现啊呀原来是Internal接口变了,可真是郁闷。还带来的另一个问题是如果功能模块被加密了,type.InvokeMember就挂了。现在可就好了,隆重介绍InternalsVisibleToAttribute。
只需要在功能模块的Assembly中指定InternalsVisibleTo到我的单元测试程序集。我的单元测试程序中就可以很容易方便地访问所有Internal的接口了。
具体举例:
功能模块, Assembly name:MyModule
单元测试, Assembly name:MyTest
Step by step介绍步骤
1. 生成Snk及查找PublicKey,举例中我用sn随机生成了snk文件
生成私钥
生成公钥
获取公钥字符串
可以看到:
Public key是我们这里要关心的。(Bata2中用到的是Public key token,本文Sample在RTM上完成)
这样我们得到了私钥文件test.snk和Public key字符串
2. 在MyModule工程中找到AssemblyInfo.cs,添加:
3. 在MyTest和MyModule工程中都添加test.snk。
4. MyTest和MyModule工程属性中都指定test.snk签名,如图示
Build我们的程序,搞定!