【发布时间】:2011-10-01 11:52:43
【问题描述】:
我正在升级到 Rails 3.1,但在测试我们包含在多个 ActiveRecord 模型中的模块时遇到问题。我们之前使用了一个测试模型,如下所示:
describe FundTransfer do
class TestFundTransfer < ActiveRecord::Base
include FundTransfer
# stub db columns
class << self
def columns() FundReturn.columns; end
end
end
subject { TestFundTransfer.new }
it { should belong_to(:admin) }
it { should belong_to(:bank_account) }
it "is not valid without bank account and moneybookers account" do
fund_transfer = TestFundTransfer.new
fund_transfer.should_not be_valid
end
(完整规范:https://gist.github.com/1255960)
这会中断,因为它找不到表。我可能会找到一种方法来存根列(就像我们之前所做的那样),但我的问题是:有没有人有经验以更好的方式做到这一点?在这种形式中,我们无法测试任何涉及保存/加载模型的内容。
我正在考虑以下选项:
- 创建一个污染主架构的表
- 在事务开始之前在测试中创建一个表
- 存根列(不允许保存/查找)
有没有人有这方面的经验或有更好的主意?
注意: mixin 指定了belongs_to 关联,因此我不能将ActiveModel 模块用于我的测试模型,它必须是ActiveRecord 模型。
【问题讨论】:
-
对不起,我不能直接回答你的问题,但你为什么要测试belongs_to?那以及您的验证可能也是rails的关注点,而不是您的关注点。测试你自己的代码,而不是 rails。
-
也许我没有抓住重点,但 assert_belongs_to 和 co。在我看来总是很愚蠢。
-
首先,我不认为测试belongs_to 是没有意义的。例如,您可以覆盖 bank_account 方法以接受一些选项,但您的测试将确保它在正常参数下仍然表现良好。此外,最好确保有人不会意外删除这些 rails 调用。其次,我有更多测试,更“原始” :) 完整文件在这里:gist.github.com/1255960
-
这些都是公平的。我仍然不鼓励使用测试宏自动测试对 rails 方法的调用。在大多数情况下,您只是在添加没有价值的重复内容。
标签: ruby-on-rails ruby-on-rails-3 unit-testing ruby-on-rails-3.1 rspec2