rspec - rspec 是否记住了 `subject` block ?

标签 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(:user) }
  it { ... }
end

我们的风格指南的预期效果是我们为每个正在测试的方法有一个不同的主题块。这会减慢我们的测试速度吗?如果我们使用 subject以典型的方式,我们是否会从每个类只有一个主题块的内置内存或其他加速中受益?

旁白:

我遇到过一种我们的风格不起作用的情况。使用时 any_instance.should_receive你不能遵循我们的风格指南,否则规范将永远失败。相反,您需要使用更传统的方法,其中 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

我应该注意这种风格的其他问题吗?

最佳答案

subject被懒惰地创建,每次测试,并限定为 context/describe ,就像 let .他们不应该有任何额外的开销。

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

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

关于rspec - rspec 是否记住了 `subject` block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19613876/

相关文章:

ruby-on-rails - FactoryGirl 中的 stub 方法

javascript - 选择更改 Angular 实现?

angular - 如何将多个主题合并到可观察中并在订阅时发出

javascript - Angular 2 - 服务与 BehaviorSubject 创建一个循环

ruby-on-rails - 如果文件被删除,如何在 rspec 中进行测试?

ruby-on-rails - Rails Rspec 错误 - 未定义的方法 `visit'

ruby-on-rails - 在 RSpec Capybara 测试中,您如何 stub 您自己的应用程序的 API?

javascript - 当我在 Angular 应用程序中调用 .next() 一次时,主题订阅被触发两次

angular - 为什么组件中的 ', providers: [TravelService] ' 会阻止 RXJS 行为主体跨组件共享数据?

Angular 2.0.1 AsyncPipe 不适用于 Rx Subject