使用Rspec时,截断、事务和删除数据库策略之间有什么区别?我找不到任何资源来解释这一点.我阅读了数据库清洁器自述,但它没有解释每一个的作用.

为什么我们必须对水豚使用截断策略?测试时我需要清理数据库吗?或者我可以禁用它吗.我不明白为什么我应该在每个测试用例之后清理我的数据库,这会不会降低测试速度?

推荐答案

数据库清理策略指的是数据库术语.也就是说,这些术语来自(SQL)数据库世界,所以通常熟悉数据库术语的人都知道它们的意思.

下面的示例涉及SQL定义.然而,DatabaseCleaner也支持其他非SQL类型的数据库,但通常定义是相同或相似的.

Deletion

这意味着使用SQL DELETE FROM语句清理数据库表.这通常是slower than truncation,但是是may have other advantages instead.

Truncation

这意味着使用TRUNCATE TABLE语句清理数据库表.这将直接清空表,而不删除表 struct 本身或单独删除记录.

Transaction

这意味着使用BEGIN TRANSACTION条语句和ROLLBACK条语句来回滚之前的数据库操作序列.可以将其视为数据库的"undo撤消按钮".我认为这是最常用的清理方法,而且可能是最快的,因为更改不需要直接提交给DB.

示例讨论:Rspec, Cucumber: best speed database clean strategy

Reason for truncation strategy with Capybara

最好的解释出现在Capybara docs themselves个选项中:

# Transactional fixtures do not work with Selenium tests, because Capybara
# uses a separate server thread, which the transactions would be hidden
# from. We hence use DatabaseCleaner to truncate our test database.

Cleaning requirements

您不必在每个测试用例之后清理数据库.然而,你需要意识到这可能带来的副作用.也就是说,如果在一个步骤中创建、修改或删除一些记录,其他步骤是否会受到影响?

通常情况下,RSpec运行时会打开事务装置,因此在运行RSpec时,您永远不会注意到这一点——它只会让数据库自动保持干净:

https://www.relishapp.com/rspec/rspec-rails/v/2-10/docs/transactions

Ruby相关问答推荐

这个#divmod 方法输出这个结果是做什么的?

如何在 Ruby 中创建可调用属性

生成带有小写字母和数字的唯一随机字符串

厨师从源代码安装和更新程序

确保 Capybara 不存在元素

Faraday中的timeout和open timeout是什么?

如何期望 RSpec should_receive 的一些(但不是全部)参数?

Coffeescript 中等效的 Ruby .times

如何在 ruby​​ 中编写负循环,例如 for(i=index; i >= 0; i --)

确定字符串数组是否包含ruby中的某个子字符串

如何声明 RSpec 中示例之间共享的变量?

在 ruby​​ 中将每个数组元素添加到文件的行中

Ruby,生成随机十六进制 colored颜色

如何让 Ruby 1.9 成为 Ubuntu 上的默认 Ruby?

Ruby 1.9 哈希,键中有破折号

我们什么时候在 Rails 中使用 "||=" 运算符?它的意义是什么?

如何使用 link_to Ruby on rails 添加确认消息

Ruby:define_method 与 def

如何在 Rails 应用程序中使用 httparty 的基本身份验证?

JavaScript Array:获取项目的范围