shoulda-matchers RSpec expect syntax

前端 未结 2 1673
伪装坚强ぢ
伪装坚强ぢ 2021-01-30 17:49

What is the correct format for using shoulda-matchers and RSpec\'s new expect syntax?

相关标签:
2条回答
  • 2021-01-30 18:20

    While one could certainly use the shoulda-matchers with the new expect syntax as follows:

    it 'should validate presence of :email' do
      expect(subject).to validate_presence_of :email
    end
    

    or the more concise but less readable:

    it { expect(subject).to validate_presence_of :email }
    

    the one-liner should format these matchers are typically used with is explicitly supported in 2.14 even when config.syntax == :expect. When should is being used with an implicit subject as in:

    describe User
      it { should validate_presence_of :email }
    end
    

    it does not rely on the monkey patching of Kernel that should otherwise depends on.

    This is covered in https://github.com/rspec/rspec-expectations/blob/master/Should.md. In fact, that documentation even uses the above shoulda matcher example to illustrate this exception.

    See also Using implicit `subject` with `expect` in RSpec-2.11, which discusses a configuration option which lets you use as an alternative to it.

    expect_it { to validate_presence_of :email }
    

    Update: As of RSpec 3.0 (beta2), you will also be able to use:

    it { is_expected.to validate_presence_of :email }
    
    0 讨论(0)
  • 2021-01-30 18:29

    I'll suplement the answer of @peter-alfvin. In case you test the model and its migration themselves with shoulda-matchers you can't use :expect outside of it block, so can't write:

    RSpec.describe ModelName, type: :model do
       expect(subject).to belong_to(:user)
    end
    

    And you will get the expection:

    `expect` is not available on an example group (e.g. a `describe` or `context` block).
    

    but correct version is:

    RSpec.describe ModelName, type: :model do
       it { expect(subject).to belong_to(:user) }
    end
    
    0 讨论(0)
提交回复
热议问题