如何在不重新启动let块的情况下在示例块中使用let变量?

时间:2017-03-30 15:22:23

标签: ruby-on-rails ruby rspec

我想创建FactoryGirl对象并跨组使用,而无需多次重新启动let block。应该只有一个用户在数据库中创建。我怎样才能实现它?

describe MyCLass do
  let(:adm) { FactoryGirl.create(:user) }

  describe "test for" do
    #want to use :adm here
  end

  describe "test2 for" do
    #want to use :adm here
  end

  describe "test3" do
    #want to use :adm here
  end
end

*我是RSpec的新手

2 个答案:

答案 0 :(得分:3)

最好的办法是不要使用let,而应使用before :all

describe MyCLass do
  before :all do
    @adm = FactoryGirl.create(:user)
  end

  describe "test for" do
    @adm.methods_to_test
  end

  describe "test2 for" do
    @adm.methods_to_test
  end

  describe "test3" do
    @adm.methods_to_test
  end
end

话虽如此,这可能不是一个好主意,因为它会创建相互依赖的测试,这不是你想要的!每个测试都应该独立运行,而不需要在测试之间修改状由于测试订单问题,拥有“全局”用户实例可能会导致抖动测试。

答案 1 :(得分:1)

  

在数据库中应该只创建一个用户。我怎样才能实现它?

每次测试后清理数据库。这是一般推荐的方法。例如,查找DatabaseCleaner gem。