论坛首页 编程语言技术论坛

Rspec的疑问

浏览 5621 次
锁定老帖子 主题:Rspec的疑问
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-04  
这里已经有不少人会提到用rspec来代替unit test. 不过就是没有说详细怎么用。 google然后学习,问号一堆。希望会的同学解答下。

1。rspec和unit test相比,最显著的好处是什么?
2。rspec通过 mock stub 来控制 model对象的生成和某些方法的响应结果,为什么需要这样的控制?
3。unit test是针对 class的接口来测试的,那rspec的测试些什么?
4。unit test需要对接口进行true和false两个方面的测试,rspec也需要吗?
5。rspec和unit test的测试出发点,具体有哪些不同之处。


   发表时间:2007-09-04  
rspec本质上就是unit test,只不过在风格写法上有点不同而已,这就是一个个人喜好的问题。你比较喜欢assert_equal呢,还是更符合英文语法xxx.should be xxx呢。当然有人认为风格很重要,是对思维方式的改造,所以很多人现在说要BDD,而不是TDD。

rspec的mock很像Java的easymock,其实你不一定要用。只不过他比你在rails的unit test下面写mock类要方便一些而已(假如你确实需要写mock类的话)。

rspec_on_rails在功能上面一定要说的话,比rails unit test多了helper test和view test,少了integration test。
0 请登录后投票
   发表时间:2007-09-04  
BDD比TDD更加符合思维惯例,其他就没有特别的优点了
比方说偶们描述一下足球比赛:
一场比赛应该有2个参赛队伍,一个队伍应该有11个上场球员

用TDD得这样写:
assert_equals(2, match.team.size)
assert_equals(11, team.players.size)

你还得注意不要把expected和actual的2个参数位置弄反了,导致出错信息颠倒。

用BDD就没有这样问题了:
match.should have(2).team
team.should have(11).players

完全是符合自然语法习惯的代码编写

RSpec还很容易扩展它的DSL,比方说想天下无贼里面的You should be sorry to me
偶们可以写个class,定义一个be_sorry_to的方法:
def be_sorry_to(expected)
  BeSorryTo.new(expected)
end  

然后就可以这样用了:
  
  you.should be_sorry_to(me)
0 请登录后投票
   发表时间:2007-11-07  
小声问一下。
用rspec写测试之后,还能用rcov来查看测试覆盖率吗?
命令是什么呢?

另外,是关于functional test的。
是一个简单的用户激活程序,就是注册某论坛。然后给你发了个电子邮件。
里面有个连接,你点击了之后,才算你成功注册了。

我在controller 有这样一个method:

  def active_user
    user = User.find_by_id(params[:id])
    if user.activation_key.eql?(params[:key])
        user.account_active = 'Yes'
        user.save!
        flash[:notice] = 'Congratulation.'
    else    
        flash[:notice] = 'Invalid activation key!'
    end
    redirect_to :action => 'index'
  end



测试程序是:
  def test_active_user    
    new_user = User.find(1)
    get :active_user, :id=>new_user.id, :key=>new_user.activation_key
    assert_redirected_to :action => 'index'
    assert_equal new_user.account_active, 'Yes' 
  end


yml是:
one:
  id: 1
  first_name: 'Fname'
  last_name: 'Lname'
  account_activation: 'No'
  activation_key: '9876543210'


运行测试的结果总是:
  1) Failure:
test_active_user(DemoControllerTest) [C:/demo/test/functional/demo_controller_test.rb:102]:
<"No"> expected but was
<"Yes">.


也就是说 user 的属性并没有在运行 这行code之后储存起来。
get :active_user, :id=>new_user.id, :key=>new_user.activation_key

所以还是原来的值。
可是我不大明白,为什么不能储存属性的变化呢?
请较高人,这个测试的错误在什么地方?



0 请登录后投票
   发表时间:2007-11-07  
rspec和rcov的结合请看文档:
http://rspec.rubyforge.org/tools/rcov.html

你的测试代码错误是这句:
assert_equal new_user.account_active, 'Yes'

应该改成:
assert_equal new_user.reload.account_active, 'Yes'
0 请登录后投票
   发表时间:2007-11-08  
我也在看rspec. 比rails自带的test framework 好用。 看到一个ibm的tech note介绍rspec挺完整的,值得一读
http://www.ibm.com/developerworks/web/library/wa-rspec/

另外,rspec提供一个很有意思的功能,和 Heckle 结合,可以测试你的的测试是否确实是合格的测试。
http://rspec.rubyforge.org/documentation/tools/heckle.html

虽然,我依然认为TDD所提倡的test -> implementation -> design 是一种倒行逆施,容易使程序设计师失去全局观,造成成品和预期的误差增加。


0 请登录后投票
   发表时间:2007-11-08  
Readonly 写道
rspec和rcov的结合请看文档:
http://rspec.rubyforge.org/tools/rcov.html

你的测试代码错误是这句:
assert_equal new_user.account_active, 'Yes'

应该改成:
assert_equal new_user.reload.account_active, 'Yes'


十分感谢,问题已解决.
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics