DotNetMock-单元测试的利器

时间:2010-02-21 09:37:28  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:,碰动了什么地方,就可能导致刚刚写的单元测试代码死活都绿不了(使用NUnit作为单元测试工具的时候,如果测试通过时,测试Case前面的图标会变成绿色的),更为离谱的是,如果希望单元测试代码能够在别的计算机上正常运行,还得为这段测试代码写一大段环境准备说明,天啦,这简直不是在写测试,而是在作一个目标系统的测试系统。如果再雪上加霜的遇到一个弱智设计,所有的代码都耦合到一起...
  正文:在写单元测试的时候,如果被测试代码需要依赖外部环境(数据库注册表、网络服务等)或者其它外部对象时,我们需要编写大量的代码来构建测试环境、构建被测试代码所依赖的外部对象,工作量大不说,而且编写的单元测试代码本身也可能非常脆弱,可能稍稍不小心,碰动了什么地方,就可能导致刚刚写的单元测试代码死活都绿不了(使用NUnit作为单元测试工具的时候,如果测试通过时,测试Case前面的图标会变成绿色的),更为离谱的是,如果希望单元测试代码能够在别的计算机上正常运行,还得为这段测试代码写一大段环境准备说明,天啦,这简直不是在写测试,而是在作一个目标系统的测试系统。如果再雪上加霜的遇到一个弱智设计,所有的代码都耦合到一起的话(比如所有的功能都写到了UI里面),那么恭喜你,中大奖了,如果这种情况下都能把单元测试做好,还有什么单元测试你做不好?
   对于上面提到的这种情况下,在单元测试中已经有一个成熟的解决方案就是:写Mock对象。顾名思义,Mock对象就是假对象,就是替身。例如,如果我们要测试UserProfileCache类,这个UserProfileCache类的职责是维持UserProfile信息的缓存并且提供检索,代码如下:
   1 '用于提供用户信息的提供者
   2 Public Interface IUserProfileProvider
   3
   4 '获得用户信息
   5 Function GetProfile() As UserProfile()
   6
   7 End Interface
   8
   9 '用户信息的缓存对象
  10 Public Class UserProfileCache
  11
  12 '默认的构造函数
  13 Public Sub New(ByVal provider As IUserProfileProvider)
  14 End Sub
  15
  16 '通过编号检索用户信息
  17 Public Function Lookup(ByVal id As System.Guid) As UserProfile
  18
  19 '检索Profile
  20 Dim profile As UserProfile = Me._profiles(id)
  21
  22 '判断是否有效
  23 If profile Is Nothing Then
  24
  25 '获得列表
  26 Dim tempItems As UserProfile() = Me._provider.GetProfile()
  27
  28 '判断是否为空
  29 If Not tempItems Is Nothing Then
  30
  31 '更新缓存的内容
  32 For Each profile In tempItems
  33
  34 '添加到Hash表中
  35 Me._profiles.Remove(profile.Id)
  36
  37 '重新添加
  38 Me._profiles.Add(profile.Id, profile)
  39 Next
  40 End If
  41
  42 Else
  43
  44 '返回数据
  45 Return profile
  46 End If
  47
  48 '返回数据
  49 Return Me._profiles(id)
  50
  51 End Function
  52
  53 End Class
  54
  55 '用户信息
  56 Public Class UserProfile
  57
  58 '编号
  59 Public Id As System.Guid
  60
  61 '名称
  62 Public Name As String
  63
  64 '用户数据
  65 Public Data As String
  66
  67 End Class 在不使用Mock框架的情况下,我们需要编写如下的单元测试代码来测试CacheProfileCache类的Lookup方法:
   1 <Test()> _
   2 Public Sub Test_Lookup()
   3
   4 '创建Mock Provider
   5 Dim provider As New MockProvider
   6 provider.ExpectProfile = New UserProfile
   7
   8 '创建测试对象
   9 Dim cache As New UserProfileCache(provider)
  10
  11 '断言
  12 Assert.AreSame(cache.Lookup(provider.ExpectProfile.Id), provider.ExpectProfile)
  13
DotNetMock-单元测试的利器》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Programming/aspnet/12857.html

 1/4    1 2 3 4 下一页 尾页


关键字:

关于《DotNetMock-单元测试的利器》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td