[ruby off rails] ohm作者这两个哥们确实猛(后有rspec技巧)

花花公子 2011-02-19
他们除ohm外的部分作品

cutest - ohm教程中使用,简单的测试框架
spawn  - 名字有点大众,比FactoryGirl简单的fixture生成
cuba   - 这个虽然没有sinatra好看及有名,毕竟是redis.io的后台程序,也是以小巧轻量为特点。

花花公子 2011-02-19
cutest不够给力,spawn已经用上了,rspec2中的let和expect{}.to change相当不错
花花公子 2011-02-19
使用satisfy

  page.should have_content description
  page.should have_content truncate(h content)


更新为
  subject { page }
  it { should have_content description }
  it { should have_content truncate(h content) }
花花公子 2011-02-20
使用spork(https://github.com/timcharper/spork)可以加速rspec测试,比如空的rails 3测试(spork就是节省了加载rails的时间而已)

没有使用spork
$time rspec spec/acceptance/contact_spec.rb

Finished in 0.07662 seconds
1 example, 0 failures

real    0m4.314s
user    0m3.770s
sys     0m0.520s


使用了spork
$ time rspec spec/acceptance/contact_spec.rb --drb

Finished in 0.05034 seconds
1 example, 0 failures

real    0m0.318s
user    0m0.120s
sys     0m0.080s


减肥效果如此明显!你的测试的时间都花在加载文件上而不是真正的运行上面了!
night_stalker 2011-02-21
spork貌似和server模式的autotest很相似,不知道是不是也有重载没弄干净之类的问题……
花花公子 2011-02-21
night_stalker 写道
spork貌似和server模式的autotest很相似,不知道是不是也有重载没弄干净之类的问题……


目前还没有遇到过,我经常发现开发模式下i18n添加文件会需要重启,测试模式应该会用同样问题。
花花公子 2011-02-21
附带一下let和expect{}.to change的用法,比如hello_world一般神圣的测试用户登录:

一般我们会写

before {
  @user = User.create
}
it {
  @user.should be_normal_user
}


可是那个@user看上去就不搭调,如果使用let,就可以

let(:user) { User.create }

it { user.should be_normal_user }

而且let代码块一个example只运行一次。


expect{}.to change的例子也拿这个举例,我们常常这样写:
user_count = User.count
User.create
User.count.should == user_count+1


使用了expect{}.to change以后:
expect {
  User.create
}.to change(User, :count).by(1)


现在对于属性的测试的简化还不够,比如
user.name.should == "name"
user.address.should == "address"

就不方便简化
its只能作为独立的example运行,不够爽。

更新:目前看来,真要简化,就要使用its,比如stackoverflow上这篇:
http://stackoverflow.com/questions/2738232/refactoring-rspec-specs

不过我今天学到的一句话是“如果你要求每段代码都达到高水准,我建议先去学点别的“(应该是指软件工程学),没必要要求自己每一段测试代码都读上去像散文一样优美。cucumber更加优美,也更加耗时间。
花花公子 2011-02-21
night_stalker 写道
spork貌似和server模式的autotest很相似,不知道是不是也有重载没弄干净之类的问题……


http://www.rubyinside.com/how-to-rails-3-and-rspec-2-4336.html

作者提供的方法是修改config/environments/test.rb

config.cache_classes = true


改为
config.cache_classes = false
Global site tag (gtag.js) - Google Analytics