Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用RSpec测试相同数据上的大量读取的好策略?_Ruby_Testing_Rspec - Fatal编程技术网

Ruby 使用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

我正在用RSpec测试一个从数据库读取数据的类。根据参数的不同,它不会返回相同的结果

我目前的战略是这样的:

  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配置中,并在存在元数据键的情况下包含它。