首页 > 解决方案 > 清理 rspec 中的 shared_context 变量

问题描述

RSpec.shared_context用来设置所有描述块将使用的变量。

像这样的东西

RSpec.shared_context "common" do 
  let(:name) { #creates a database object }
   #more let statements
end

现在我像这样从描述块中调用它

describe "common test" do 
  include_context "common"
  #run few tests
end

现在运行描述块后,我想清理它。如何回滚在共享上下文中创建的所有对象?

我尝试在after(:context)钩子中清理它,但由于它是一个 let 语句,因此该变量name只允许在示例中使用。

在描述块中运行测试后,有什么方法可以use_transactional_fixtures用来清理它。

标签: ruby-on-rails-4rspecrspec3

解决方案


如果您只是正确设置测试套件以擦除数据库,则无需担心清理“let”。

使用 let 定义一个记忆化的辅助方法。该值将在同一示例中的多个调用中缓存,但不会跨示例缓存。

注意 let 是惰性求值的:直到它定义的方法第一次被调用时才会求值。

几乎在每种情况下,您都希望自动进行拆卸,例如。就是config.transactional_fixtures这样 - 它在每个示例之后回滚数据库,以便您有一个新的石板并且不会遇到测试排序问题。依靠每个示例/上下文来显式清理自身只是失败的秘诀。


推荐阅读