`
seemoon
  • 浏览: 159106 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

单元测试势在必行的一个例证

阅读更多
今天对一段已经经过rspec测试的用例代码重新运行,意外地发现测试没有通过。经过跟踪调试发现是由一个model类的方法改动造成:

原方法:
class Modelx < ActiveRecord::Base
  def methoda
    #blablabla
    self.save!
  end
end


更改后的方法:
class Modelx < ActiveRecord::Base
  def methoda
    #blablabla
    self.save!
    wanna_do_sth
  end
end


改动后的方法并没有返回布尔值!这种错误是不经意而且是容易犯下的,如果能够在对方法重构或者更改后立即有一个"单元测试"的习惯,这个错误是立即可以发现并解决。可见单元测试在开发中势在必行,且作用价值不可估量。
分享到:
评论
6 楼 gigix 2008-09-03  
gakaki 写道
不是可以使用autotest的吧 代码以改变立刻 自动做单元测试 那个插件

show一段Rakefile里的内容
task :commit => %w(svn:up default svn:add svn:commit log:clear)
task :default => %w(db:test:prepare unit functional)

namespace :svn do
  task :add do
    sh %(svn st | grep "^?" | awk -F "      " '{printf "\\"%s\\"\\n", $2}' | xargs svn add)
  end
  
  task :commit do
    sh %(svn stat --ignore-externals)
    require 'readline'
    pair = prompt_cached 'Pair'
    story = prompt_cached 'Story / Bug Number'
    comment = prompt_cached 'Comment'
    sh %(svn ci -m "#{pair} - ##{story} - #{comment}")
  end
  
  def prompt_cached(label)
    file = ".#{label.gsub(/\W/, '')}"
    value = File.read(file) if File.exist?(file)
    new_value = Readline.readline("#{label}#{value ? " [#{value}]" : ''}: ")
    if new_value.any?
      value = new_value
      File.open(file, 'w') {|f| f.write value }
    end
    value
  end
  
  task :up do
    ignore_externals = "--ignore-externals" if ENV['IGNORE_EXTERNALS']
    sh %(svn up #{ignore_externals})
  end
end

重点看前两行,后面供参考。
提交代码必须用“rake commit”,于是世界清净了。
5 楼 gakaki 2008-09-03  
不是可以使用autotest的吧 代码以改变立刻 自动做单元测试 那个插件
4 楼 caryl 2008-08-27  
open2ye 写道
以上代码还有错误 save! 是抛错的.

save 返回值才是 true | false

记得在哪里看到javaeye是在application中统一处理异常,所以减少了不少的代码量。
类似于beast的做法。
3 楼 open2ye 2008-08-14  
以上代码还有错误 save! 是抛错的.

save 返回值才是 true | false
2 楼 QuakeWang 2008-08-13  
除了单元测试,我觉得这里还有一个值得讨论的问题就是ruby的代码规范:
1. 如果需要返回布尔值的方法名,在方法名最后加上?
2. ruby不需要显式调用return关键字,如果知道方法的执行结果需要被调用者用到,建议还是加上return。

class Modelx < ActiveRecord::Base
  def methoda?
    #blablabla
    return self.save!
  end
end


这样可以减少错误发生的几率
1 楼 dazuiba 2008-08-13  
这是很常见的一个bug。
很多修改api的开发者,并不完全了解该api的用法(包括这个api的设计者)。
所以,在命名中说明清楚,是一个不错的选择,

相关推荐

Global site tag (gtag.js) - Google Analytics