Rspec hooks 配置

Jun 19, 2011

        最近项目中有碰到这样一个场景, 我们需要给测试中给每个测试案例置于事务之中,确保方法运行完后回滚所有的数据操作.于是最简单的,在spec_helper.rb中添加如下代码:     
  config.around(:each) do |example|
    WAREHOUSE_DB.transaction do
      example.run
      raise Sequel::Error::Rollback
    end
  end
 end
    我们这里用的是Sequel来从数据库获取数据, 需要说明的是我们做得项目不是一个独立的,而是嵌在一个大项目中,我们工作的目录主要的是lib/warehouse/下, 而且也只有我们需要使用Sequel. 这样看起来目的是达到了, 后来项目在尝试加速测试的时间, 发现这个时间很多开销在打开事务和关闭事务,而其他项目根本不会用到sequel. 这样一来,也就是说,我们只想让这个事务开启回滚只发生在lib/warehouse/models目录中,而其他目录根本不需要. 那Rspec 有没有这样的功能能配置这个example(测试案例)的条件了? 有.     
 #wrap transaction only to model layer of lib/warehouse
config.around(:each, :example_group => { :file_path => /\bspec\/lib\/warehouse\/models/ }) do |example|
    WAREHOUSE_DB.transaction do
       begin
         example.run
       ensure
        Sequel::Error::Rollback
       end
   end
end
    其中关键的就是":example_group => { :file_path => /\bspec\/lib\/warehouse\/models/ }" , 这句话指定这个测试案例运行的条件,那就是这个spec文件的路径必须跟"/\bspec\/lib\/warehouse\/models/" 匹配上,才会开启和关闭事务,否则直接运行. 这个其实还满好用的,那现在我们只是用了:file_path这个过滤条件, 哪有没有更加强大的支持了? 有.         参考: RSpec 2.0 and before/after hooks