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

  上篇随笔简单了解了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

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

  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测试时候出现问题这里我们在断言里还是使用pricebefore_type_cast版本

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

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


  2 tests, 10 assertions, 0 failures, 0 errors

  证明所有断言都成功了现在到数据库里看看id为1productprice字段已经更新为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高人指点

Tags:  rubyonrails安装 rubyforrails rubyrails rubyonrails

延伸阅读

最新评论

发表评论