快速业务通道

Ruby on rails开发从头来(windows)(二十)-测试model(CRUD) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

Ruby on rails开发从头来(windows)(二十)-测试model(CRUD)

时间:2011-12-02 博客园 Cure

上篇随笔简单了解了rails的测试和测试用数据的使用,这次来看看怎样对一个model进行添删查改的测试。

1.还是使用上次写的products_test.rb,修改test_turth方法的名字为test_create,并且使其内容为:

 def test_create
  assert_kind_of Product, @product
  assert_equal 1, @product.id
  assert_equal "Pragmatic Version Control", @product.title
  assert_equal "How to use version control", @product.description
  assert_equal "http://.../sk_svn_small.jpg", @product.image_url
  assert_equal 29.95,@product.price
  assert_equal "2005-01-26 00:00:00",
  @product.date_available_before_type_cast
 end

然后运行测试命令:depot>ruby test/unit/product_test.rb,屏幕上会显示信息:

Loaded suite test/unit/product_test
Started
F
Finished in 0.109 seconds.1) Failure:
test_create(ProductTest) [test/unit/product_test.rb:16]:
<29> expected but was
<#<BigDecimal:4aad7b0,''0.2995E2'',8(8)>>.1 tests, 6 assertions, 1 failures, 0 errors

我们看到,是assert_equal 29.95,@product.price断言失败了。根据《Agile Web Development with Rails》里的内容,这句断言应该是正常通过的。但是不知道是不是版本或环境的问题,我自己写的时候总是不行。为了能够使断言通过,我们修改一下,把

assert_equal 29.95,@product.price

改为:assert_equal "29.95",@product.price_before_type_cast

我们看到了,product对象的每个属性都有对应的_before_type_cast版本,其内容是一个字符串。

现在再次运行测试命令,得到的结果如下:

Loaded suite test/unit/product_test
Started
.Finished in 0.078 seconds.

1 tests, 7 assertions, 0 failures, 0 errors

从上面的测试中看到,我们在setup方法中,从数据库中查找了id为1的记录,然后在test_create方法中对其的属性逐个判断测试。

Ruby on rails开发从头来(windows)(二十)-测试model(CRUD)(2)

时间:2011-12-02 博客园 Cure

2.对创建和读取的测试完成了,我们来进行对Update的测试,添加方法test_update,在这个方法里我们要对price字段进行更新,并通过断言判断是否成功更新:

 def test_update
  assert_equal "29.95", @product.price_before_type_cast
  @product.price = 99.99
  assert @product.save, @product.errors.full_messages.join("; ")
  @product.reload
  assert_equal "99.99", @product.price_before_type_cast
 end

基于上面的test_create方法中对price测试的时候出现的问题,这里我们在断言里还是使用price的before_type_cast版本。

再次运行测试命令,屏幕上的输出如下:

Loaded suite test/unit/product_test
Started
..Finished in 0.078 seconds.

2 tests, 10 assertions, 0 failures, 0 errors

证明所有的断言都成功了,现在到数据库里看看,id为1的product的price字段已经更新为99.99了。

3.最后我们来测试删除,添加test_destroy方法,内容如下:

def test_destroy
  @product.destroy
  assert_raise(ActiveRecord::RecordNotFound) { Product.find(@product.id) }
 end

运行测试命令,屏幕上输出如下:

Loaded suite test/unit/product_test
Started
..E
Finished in 0.078 seconds.1) Error:
test_update(ProductTest):
ActiveRecord::RecordNotFound: Couldn''t find Product with ID=1
……

3 tests, 8 assertions, 0 failures, 1 errors

上面的测试里,先删除掉id为1的记录,然后使用断言,如果失败,就抛出一个ActiveRecord::RecordNotFound的错误。

写到这里,从上面的信息里显示是test_update方法中显示了异常信息,按照直觉,应该是test_destroy方法才对,这个问题现在自己也还没有搞明白,还请rails高人指点。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号