我有一个模型函数,我想确保它使用事务。例如:
class Model
def method
Model.transaction do
# do stuff
end
end
end
我目前的方法是在 block 内存入一个方法调用以引发 ActiveRecord::Rollback
异常,然后检查数据库是否真的发生了变化。但这意味着如果由于某种原因 block 内的实现发生变化,那么测试就会中断。
你会如何测试这个?
最佳答案
你应该换个角度看问题。 从行为的角度来看,测试函数是否使用事务是没有用的。它不会为您提供有关函数是否按预期运行的任何信息。
您应该测试的是行为,即预期结果是否正确。为清楚起见,假设您在函数内执行操作 A 和操作 B(在一个事务内执行)。操作 A 在您的应用中向用户记入 100 美元。操作 B 从用户信用卡中扣除 100 美元。
您现在应该为测试提供无效的输入信息,以便从用户的信用卡中扣款失败。将整个函数调用包装在 expect { ... }.not_to change(User, :balance)
中。
通过这种方式,您可以测试预期的行为 - 如果信用卡借记失败,则不要将金额记入用户。此外,如果您只是重构您的代码(例如,您停止使用事务并手动回滚),那么您的测试用例的结果应该不会受到影响。
话虽如此,您仍然应该像@luacassus 提到的那样单独测试这两个操作。此外,如 @rb512 所述,如果您对源代码进行“不兼容”更改(即更改行为),那么您的测试用例应该失败是完全正确的。
关于ruby-on-rails - 如何测试某个函数是否使用 Rails 和 rspec 2 中的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10511236/