在工作中经常会碰到类似的情况:我写了个功能模块,现在需要对它进行单元测试,功能模块在某个程序集中,而我的单元测试却在另外一个程序集中。功能模块是对外的,接口上当然是有很严整的访问权限,而单元测试也许需要调用到一些Internal的类或者方法。我们会怎么做呢?VS2003之前,我只好用type.InvokeMember来做。但是也存在很多的问题,当功能模块中的接口发生了变化(要知道,对内接口可是很容易就Rename),那么在编译阶段,单元测试通过了,运行却出错了,我们辛辛苦苦发现啊呀原来是Internal接口变了,可真是郁闷。还带来的另一个问题是如果功能模块被加密了,type.InvokeMember就挂了。现在可就好了,隆重介绍InternalsVisibleToAttribute

      只需要在功能模块的Assembly中指定InternalsVisibleTo到我的单元测试程序集。我的单元测试程序中就可以很容易方便地访问所有Internal的接口了。

      具体举例:
      功能模块, Assembly nameMyModule
      单元测试, Assembly nameMyTest

      Step by step介绍步骤
1.      生成Snk及查找PublicKey,举例中我用sn随机生成了snk文件
生成私钥

生成公钥

获取公钥字符串

可以看到:

Public key
是我们这里要关心的。(Bata2中用到的是Public key token,本文SampleRTM上完成)
这样我们得到了私钥文件test.snkPublic key字符串 

2.   MyModule工程中找到AssemblyInfo.cs,添加:

[assembly: InternalsVisibleTo("MyTest, PublicKey=0024000004800000940000000602000000240000525341310004000001000100253e8697037892e73b8a255dca20b42b4f98a7e9853125bcc11f92c9c1ed2d6ac469c0da7bbc2f05f78fd0b3fac75632582310698554bb6ab89e7997c89ee84501547679900d2ad0e7c4ec4a3d534ae1faf5292a29e892947315ac68c37f304af5090a6065288e6b3e02e35fcb8f3de0534af74e3d65fb4ec9f79de8289774bb")]

3.   MyTestMyModule工程中都添加test.snk

4.   MyTestMyModule工程属性中都指定test.snk签名,如图示

Build
我们的程序,搞定!

 附上示例代码

posted on 2012-03-19 22:40  代岳强  阅读(284)  评论(0编辑  收藏  举报