在RSpec-2.11中使用带有`expect`的隐式`subject`

时间:2012-09-04 09:30:08

标签: ruby syntax rspec rspec2

使用rspec-2.11中的新expect语法,如何使用隐式subject?有没有比明确引用subject更好的方法,如下所示?

describe User do
  it 'is valid' do
    expect(subject).to be_valid    # <<< can `subject` be implicit?
  end
end

3 个答案:

答案 0 :(得分:64)

如果您将RSpec配置为禁用should语法,您仍然可以使用旧的单行语法,因为这不会将should添加到每个对象:

describe User do
  it { should be_valid }
end

我们briefly discussed是一种替代的单行语法,但由于不需要它而决定反对它,我们觉得它可能会增加混乱。但是,如果您愿意,可以自己轻松添加:

RSpec.configure do |c|
  c.alias_example_to :expect_it
end

RSpec::Core::MemoizedHelpers.module_eval do
  alias to should
  alias to_not should_not
end

有了这个,你可以写成:

describe User do
  expect_it { to be_valid }
end

答案 1 :(得分:17)

使用Rspec 3.0,您可以使用here所述的is_expected

describe Array do
  describe "when first created" do
    # Rather than:
    # it "should be empty" do
    #   subject.should be_empty
    # end

    it { should be_empty }
    # or
    it { is_expected.to be_empty }
  end
end

答案 2 :(得分:12)

可以使用新的命名主题语法,虽然它不是隐含的。

describe User do
  subject(:author) { User.new }

  it 'is valid' do
    expect(author).to be_valid
  end
end