構文の設定
rspec-expectations が提供する主要な構文は、オブジェクトやコードブロックを明示的にラップして、それに期待を設定する expect
メソッドに基づいています。
また、古い should
ベースの構文もありますが、これはシステム内のすべてのオブジェクトに should
がモンキーパッチされていることを前提としています。ただし、この構文は時々予期しない失敗を引き起こすことがあります。なぜなら、RSpec はシステ ム内のすべてのオブジェクトを所有しているわけではなく、常に一貫して動作することを保証することができないからです。
should
構文を明示的に有効にしない限り、expect
構文を使用することをおすすめします。私たちは should
構文を完全に削除する予定はありませんが、RSpec 3 以降では、明示的に有効にしない場合に非推奨の警告が表示され、RSpec 4 ではデフォルトで無効になる予定です(外部の gem に移動する可能性もあります)。
もしも古い should
ベースのプロジェクトを expect
にアップグレードしたい場合は、transpec をチェックしてみてください。これは自動的に変換を行うことができます。
背景
以下の内容で "spec/syntaxes_spec.rb" という名前のファイルがあるとします。
require 'spec_helper'
RSpec.describe "using the should syntax" do
specify { 3.should eq(3) }
specify { 3.should_not eq(4) }
specify { lambda { raise "boom" }.should raise_error("boom") }
specify { lambda { }.should_not raise_error }
end
RSpec.describe "using the expect syntax" do
specify { expect(3).to eq(3) }
specify { expect(3).not_to eq(4) }
specify { expect { raise "boom" }.to raise_error("boom") }
specify { expect { }.not_to raise_error }
end
両方の構文はデフォルトで利用可能です
以下の内容で "spec/spec_helper.rb" という名前のファイルがあるとします。
_When_ I run `rspec`
_Then_ the examples should all pass
_And_ the output should contain "Using `should` from rspec-expectations' old `:should` syntax without explicitly enabling the syntax is deprecated".
## Disable should syntax
_Given_ a file named "spec/spec_helper.rb" with:
```ruby
RSpec.configure do |config|
config.expect_with :rspec do |expectations|
expectations.syntax = :expect
end
end
_When_ I run `rspec`
_Then_ the output should contain all of these:
| 8 examples, 4 failures |
| undefined method `should' |
## Disable expect syntax
_Given_ a file named "spec/spec_helper.rb" with:
```ruby
RSpec.configure do |config|
config.expect_with :rspec do |expectations|
expectations.syntax = :should
end
config.mock_with :rspec do |mocks|
mocks.syntax = :should
end
end
_When_ I run `rspec`
_Then_ the output should contain all of these:
| 8 examples, 4 failures |
| undefined method `expect' |
## Explicitly enable both syntaxes
_Given_ a file named "spec/spec_helper.rb" with:
```ruby
RSpec.configure do |config|
config.expect_with :rspec do |expectations|
expectations.syntax = [:should, :expect]
end
end
rspec
を実行すると、
すべての例がパスするはずです。
また、出力には "deprecated" という文字列が含まれていないはずです。