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高人指点
最新评论