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

Hos*_*Aly 42 ruby syntax rspec rspec2

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

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

Myr*_*ton 64

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

describe User do
  it { should be_valid }
end
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

有了这个,你可以这样写:

describe User do
  expect_it { to be_valid }
end
Run Code Online (Sandbox Code Playgroud)

  • 从RSpec 2.13.0开始,模块`RSpec :: Core :: Subject :: ExampleMethods`不再存在.而是使用`RSpec :: Core :: MemoizedHelpers` (2认同)
  • 我读过你们有过的关于"expect_it"的简短讨论,但我没有看到任何真正的反对意见作为你最终得到的补充,除了担心你会对为什么会有很多疑问.期待{...}`不起作用.我希望你能重新考虑它作为即将发布的标准功能.我认为`expect_it`中"it"的存在应该足以避免混淆(即让人们把它想象成'it`替代而不是'expect`替代). (2认同)

Jav*_*mae 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
Run Code Online (Sandbox Code Playgroud)

  • 这个问题是针对Rspec 2.11,而不是Rspec 3(截至本文时仍为Beta) (3认同)

Hos*_*Aly 12

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

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

  it 'is valid' do
    expect(author).to be_valid
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 你可以将主题定义为`:it`然后使用`expect(it).to be_valid` (6认同)