默认所有的Model都产生在 test/unit/xxxx_test.rb
rake clone_structure_to_test #可以把dev中的数据结果自动同步到test的数据中
数据库不好测试,因为数据是长时间有效的,很难重现,所有得采用类似csv导入的技术(我目前用的),而fixture 就是类似csv文件的东西,但是和rails内部结合更紧密,在Conveniences的作用下能自动控制数据初始状态,这也是rails的一次成功尝试(在java中未看到这样的设施, 倒是有蹩脚的dbunit...xml啊xml)
fixture的结构是一个yaml格式的文件
version_control_book:
id: 1
title: Pragmatic Version Control
description: How to use version control
image_url: http://.../sk_svn_small.jpg
price: 29.95
date_available: 2005-01-26 00:00:00
entity_name:
id: 2
title: Pragmatic Project Automation
description: How to automate your project
image_url: http://.../sk_auto_small.jpg
price: 29.95
date_available: <%=some_method%>
抬头的标记version_control_book标明了该记录的名字, 缩进的部分一共组成了一个hash做为一条记录, fixture支持使用erb指令<%%>来进行一些动态生成
在所有的的testcase中 都可以直接使用fixture :fixnames指令来导入数据到对象中, 十分方便,访问方式为fixname(:entityname),
这里的对应关系是Product.rb => products(db teable) => products.yml=>fixture :products
test_helper负责test环境中的初始化, 在这里进行的修改所有test都可以看到, 比如添加新的assert方法
1 fixture升级
2 事务管理升级
至于如何让新rails采用旧方式测试, 目前还没有这个的需求,觉得随着rails1.0流行,可能今后也不会用到
controller的测试能力
功能虽然强大,但是使用的时候应采取KISS原则写测试,有必要的才测
在ruby下,mock很简单, 如下步骤即可
require 'models/some_model'
class SomeModel
def mockedmethod(arg)
....
end
end
这样自动覆盖了原来的方法, 起到mock的效果
..见rails工具
首先通过 fixture 的动态功能批量生成数据
<% for i in 1..100 %>
order_<%= i %>:
id: <%= i %>
name: Fred
email: [email protected]
address: 123 Rockpile Circle
pay_type: check
<% end %>
在test方法中,使用 Benchmark::realltime do xxx end来跑测试即可