Ruby 使用RSpec测试相同数据上的大量读取的好策略?
我正在用RSpec测试一个从数据库读取数据的类。根据参数的不同,它不会返回相同的结果 我目前的战略是这样的:Ruby 使用RSpec测试相同数据上的大量读取的好策略?,ruby,testing,rspec,Ruby,Testing,Rspec,我正在用RSpec测试一个从数据库读取数据的类。根据参数的不同,它不会返回相同的结果 我目前的战略是这样的: before(:all) do self.use_transactional_fixtures = false DatabaseCleaner.strategy = :transaction DatabaseCleaner.start create_data end after(:all) do DatabaseCleaner.c
before(:all) do
self.use_transactional_fixtures = false
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.start
create_data
end
after(:all) do
DatabaseCleaner.clean
end
def create_data
# create the data...
end
it 'test1' # ...
it 'test2' # ...
it 'test3' # ...
end
在做之前
#创建一组数据
结束
它是“测试1”#。。。
它是“测试2”#。。。
它是“测试3”#。。。
这当然意味着我的数据将在每次测试之前创建
我希望能够在这个文件的范围内创建一次数据,并对数据进行读取
我尝试将文件的use\u transactional\u fixtures
设置为false,并使用database\u cleaner,但这会使我的测试速度提高一倍,因为我必须在测试之前和之后重新设置数据库种子
我想知道是否有办法告诉rspec“在同一事务中运行这些测试”
或者,因为我很难找到,有更好的策略进行这种测试吗?看起来使用数据库是正确的,我只是做错了。我已经将我的清理策略设置为截断,这会清空数据库 关于这个Github问题,David Chelimsky解释说,使用database_cleaner是一个不错的选择 我的测试现在如下所示:
before(:all) do
self.use_transactional_fixtures = false
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.start
create_data
end
after(:all) do
DatabaseCleaner.clean
end
def create_data
# create the data...
end
it 'test1' # ...
it 'test2' # ...
it 'test3' # ...
end
同样的测试现在运行约3.5秒,而之前运行约7秒。我很高兴:)
编辑:一个在前:所有都足够了把它放在同一个
中有什么不对?或者使用存根而不是使用数据库?我考虑过这一点,也许我最终会这么做,但这是一个解决办法,不是真正的“干净”解决方案。它还让人感觉它从单元测试中删除了“单元”。它还防止利用RSpec的全部功能,例如上下文SY您应该真正将这些视为集成测试,因为它们会影响db。这真的是before:all循环中的before:all循环吗?在每个单独的测试中?或者这是规范中的助手?抓得好!之前的第一个:一切都不应该在那里。(编辑代码)。我把它放在something_spec.rb文件中,因为我只想在那里发生。如果我在另一个文件中需要类似的功能,我会将该部分移动到RSpec配置中,并在存在元数据键的情况下包含它。