42

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

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

3 回答 3

64

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

describe User do
  it { should be_valid }
end

我们简要讨论了另一种单行语法,但因为不需要它而决定反对它,而且我们觉得它可能会增加混乱。但是,如果您更喜欢它的读取方式,您可以自己轻松地添加它:

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
于 2012-09-04T14:55:32.843 回答
17

使用 Rspec 3.0,您可以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
于 2013-12-20T19:53:32.317 回答
12

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

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

  it 'is valid' do
    expect(author).to be_valid
  end
end
于 2012-09-04T09:30:08.323 回答