web-dev-qa-db-ja.com

shoulda-matchersRSpecは構文を期待します

shoulda-matchers とRSpecの新しい 構文を期待する を使用するための正しい形式は何ですか?

26
trev9065

確かに、次のように新しいexpect構文でshoulda-matchersを使用できます。

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

または、より簡潔で読みにくい:

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

これらのマッチャーが通常使用されるワンライナーshould形式は、config.syntax == :expectの場合でも、2.14で明示的にサポートされています。 shouldが次のように暗黙のサブジェクトで使用されている場合:

describe User
  it { should validate_presence_of :email }
end

Kernelが依存するshouldのモンキーパッチには依存しません。

これについては https://github.com/rspec/rspec-expectations/blob/master/Should.md で説明されています。実際、そのドキュメントでは、上記のshouldaマッチャーの例を使用してこの例外を説明しています。

RSpec-2.11の `expect`で暗黙の` subject`を使用する も参照してください。これは、itの代わりに使用できる構成オプションについて説明しています。

expect_it { to validate_presence_of :email }

更新:RSpec 3.0(beta2)以降、以下も使用できるようになります。

it { is_expected.to validate_presence_of :email }
57
Peter Alfvin

@ peter-alfvinの答えを補足します。モデルとその移行自体をshoulda-matchersでテストする場合、itブロックの外で:expectを使用することはできないため、次のように書くことはできません。

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

そして、あなたは期待を得るでしょう:

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

しかし、正しいバージョンは次のとおりです。

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