在示例

时间:2016-03-25 11:53:31

标签: ruby-on-rails ruby rspec

我在测试中使用let(:foo) { create_foo() }create_foo是一个测试助手,可以进行一些相当费时的设置。

因此,每次运行测试时,都会创建foo,这需要一些时间。但是,foo对象本身并没有改变,我只想逐个单独测试该对象的单元测试方法。

  

那么,是否有一个相当于let的RSpec可以在多个示例之间共享变量,但保留延迟加载(如果不需要foo)这样的好东西,以及foo的自动方法定义,以便可以在共享示例中使用它,而不使用@foo引用它?

或者我必须简单地定义一个

def foo
  create_foo()
end

2 个答案:

答案 0 :(得分:1)

你能把它放在共享的例子中,但是使用memoization吗?

def foo
  @foo ||= create_foo()
end

答案 1 :(得分:1)

以这种方式使用let违背了它的设计目标。您应该考虑使用每个测试组运行一次​​的before_all

before :all do
  @instancevar = create_object()
end

请记住,如果create_object()命中数据库,这可能不明智,因为它可能会在测试之间引入耦合和维护状态。