Geo*_*Geo 61 ruby testing activerecord ruby-on-rails
这是我正在进行的集成测试的一部分:
user = User.first
assert !user.is_active?
get confirm_email_user_url(user),:confirmId => user.mail_confirmation_hash
assert_equal response.status,200
# because confirm_email_user_url modifies the activation state of the object
user = User.first
assert_equal user.state,"activated"
Run Code Online (Sandbox Code Playgroud)
我花了最后一小时调试这个:).在我的初始版本中,我在user访问confirm_email_user_url后没有重新初始化,并且inactive即使用户被激活,状态也始终如此.
我怎么知道我是否应该"重新加载"(缺少一个更好的名字)我的模型对象?我应该怎么做才能这样做?
dan*_*ain 129
user.reload每当数据库中的数据发生变化时,您都需要进行调用.
在上面的代码中,"user"对象是从数据库中提取的数据在内存中创建的User.first.然后,看起来您confirm_email_user_url修改了数据库.在您reload重新获取数据库中的数据之前,该对象不知道这一点.
我不确定是否有一种编程方式可以知道何时需要重新加载对象,但作为开发人员,您应该了解正在发生的事情并进行适当处理.在我的大多数经验中(有些限制),这只是测试期间的一个问题.在生产中,当数据库加载到内存中时,对象在数据库中进行修改并不典型.通常发生的是内存中的对象被修改然后保存到数据库(即,user.email = "foo@bar.com"后跟user.save).我想如果你有一个高活动的应用程序,许多用户可能会在短时间内修改某些东西,你会想要小心它.
顺便说一句.当你在模型本身上做的事情时,这并没有真正起作用Report.count.在无休止地尝试重置列信息或获取第一个/最后一个记录的实例并重新加载它之后,唯一有帮助的是在数据之间重新连接数据库,如下所示:
initial_count = Report.count
# do something, like invoking a rake task that imports the reports, ..
Report.connection.reconnect!
final_count = Report.count
Run Code Online (Sandbox Code Playgroud)
这适用于Rails 2.3.8+,我不知道3+版本.
| 归档时间: |
|
| 查看次数: |
40785 次 |
| 最近记录: |