rspec是否会记忆'subject'块?

rspec是否会记忆'subject'块?,rspec,subject,behaviorsubject,Rspec,Subject,Behaviorsubject,我正在使用的编码标准规定,测试函数的一组规范应该有一个主题,即被调用的函数。看起来是这样的: define User do context :foo do let(:user) { FactoryGirl.create(:user) } subject { user.foo } it { ... } end end subject块的典型用法是实例化正在测试的类: define User do subject { FactoryGirl.create(:us

我正在使用的编码标准规定,测试函数的一组规范应该有一个主题,即被调用的函数。看起来是这样的:

define User do
  context :foo do
    let(:user) { FactoryGirl.create(:user) }
    subject { user.foo }
    it { ... }
  end
end
subject
块的典型用法是实例化正在测试的类:

define User do
  subject { FactoryGirl.create(:user) }
  it { ... }
end
我们的风格指南的预期效果是,对于正在测试的每个方法,我们都有不同的主题块。这会减慢我们的测试速度吗?如果我们以典型的方式使用
subject
,我们是否会从内置的记忆或其他加速中受益,因为每个类只有一个主题块

助理:

我遇到过一个我们的风格行不通的例子。当使用
任何实例时。如果收到
您不能遵循我们的样式指南,否则规范将始终失败。相反,您需要使用一种更传统的方法,其中
subject
是您正在测试的对象,并且在规范中对其调用方法

# passing spec
define Foo do
  before { Bar.any_instance.stub(:baz) }
  subject { FactoryGirl.create(:foo) }
  it "bazzes Bars" do
    Bar.any_instance.should_receive(:baz)
    subject.baz_the_bars
  end
end

# spec follows style guide but fails
define Foo do
  before { Bar.any_instance.stub(:baz) }
  let(:foo) { FactoryGirl.create(:foo) }
  subject { foo.baz_the_bars }

  it "bazzes Bars" do
    Bar.any_instance.should_receive(:baz)
    subject
  end
end

class Foo
  has_many :bars

  def baz_the_bars
    bars.collect do |bar|
      bar.baz
    end.count(true)
  end
end

使用这种风格,我是否还需要注意其他问题?

主题是在每个测试中惰性创建的,范围是
上下文
/
描述
,就像
一样。他们不应该有任何额外的开销

我个人不喜欢您展示的样式,但当我有从方法返回的非常复杂(或只是大)的数据对象时,我也做了类似的事情

describe "A thing" do
  subject(:foo) { FactoryGirl.create(:foo) }

  # A very complicated object from this method
  describe "the result of calling frob" do
    subject(:result) { foo.frob }

    it { should be_active }
    it { should be_alive }
  end
end

我可能遗漏了什么,为什么你的酒吧存根会引起问题?主题尚未被调用,因此在方法运行之前仍应设置断言。在
before
块中,我没有存根
条。我在
Bar
的任何实例上存根方法
baz()
。我的第一个通行证是:
在{Bar.stub(:baz)}
之前,这同样有效。但是,这并没有通过代码审查,所以我需要在
块之前修改
。抱歉,我不清楚-我的意思是在所有
上存根
baz
。然而,我仍然不明白为什么你的测试失败了。您能否将示例更新为可运行的
define
在这里不是有效的关键字,我认为您可以删除对ActiveModel和FactoryGirl的引用。也许这也会让问题更容易回答。对不起,如果我的问题不清楚的话。我不是在问使用
主题是否有额外的开销。我在问,如果不在任何地方使用同一主题,是否会有额外的开销。基本上,这门学科有一些我们没有利用的回忆录。我将编辑这个问题以试图澄清。谢谢你的回答。我也无意中回答了这个问题-
主题在一次测试中被记忆,但它是每次测试,所以每次都会被重置。您可能有数千个
subject
块(这不是一个好主意),唯一额外的时间就是解析文件。谢谢。很高兴知道。我们确实有数千个
主题
块。从来没有人问过我这是不是个坏主意,但这是做事的方式。只要团队意见一致,我不在乎我们做的事情是否与其他人不同。至少我试着告诉自己:)