[解決済み] RSpec: 複数回の変更に期待
2022-11-27 23:47:47
質問
機能仕様でフォームを送信する際に、モデル内の多くの変更をチェックしたい。例えば、ユーザー名がXからYに変更されたこと、暗号化されたパスワードが任意の値で変更されたことを確認したいのです。
それについてはすでにいくつかの質問があることは知っていますが、私にぴったりの回答は見つかりませんでした。最も正確な回答は、どうやら
ChangeMultiple
のマッチャーは、こちらのMichael Johnstonによるものです。
RSpecが2つのテーブルの変化を予想することは可能ですか?
. その欠点は、既知の値から既知の値への明示的な変更のみをチェックすることです。
より良いマッチャーがどのように見えるか、いくつかの疑似コードを作成しました。
expect {
click_button 'Save'
}.to change_multiple { @user.reload }.with_expectations(
name: {from: 'donald', to: 'gustav'},
updated_at: {by: 4},
great_field: {by_at_leaset: 23},
encrypted_password: true, # Must change
created_at: false, # Must not change
some_other_field: nil # Doesn't matter, but want to denote here that this field exists
)
の基本骨格も作りました。
ChangeMultiple
のマッチャーの基本骨格も作成しました。
module RSpec
module Matchers
def change_multiple(receiver=nil, message=nil, &block)
BuiltIn::ChangeMultiple.new(receiver, message, &block)
end
module BuiltIn
class ChangeMultiple < Change
def with_expectations(expectations)
# What to do here? How do I add the expectations passed as argument?
end
end
end
end
end
しかし、今はもうこのエラーが出ています。
Failure/Error: expect {
You must pass an argument rather than a block to use the provided matcher (nil), or the matcher must implement `supports_block_expectations?`.
# ./spec/features/user/registration/edit_spec.rb:20:in `block (2 levels) in <top (required)>'
# /Users/josh/.rvm/gems/ruby-2.1.0@base/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load'
# /Users/josh/.rvm/gems/ruby-2.1.0@base/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `block in load'
このカスタムマッチャーを作成するためのヘルプは非常に高く評価されます。
どのように解決するのですか?
RSpec 3 では、一度に複数の条件を設定することができます (そのため、単一の期待値ルールが破られることはありません)。以下のような感じです。
expect {
click_button 'Save'
@user.reload
}.to change { @user.name }.from('donald').to('gustav')
.and change { @user.updated_at }.by(4)
.and change { @user.great_field }.by_at_least(23}
.and change { @user.encrypted_password }
しかし、これは完全な解決策ではありません。私が調べた限りでは、簡単に
and_not
を簡単に行う方法はまだありません。また、最後のチェックについてもよくわかりません(重要でないのなら、なぜテストするのでしょうか)。当然ながら、あなたはそれを
カスタム マッチャー
.
関連
-
[解決済み] サーバーに接続できませんでした。そのようなファイルまたはディレクトリがありません (PG::ConnectionBad)
-
[解決済み] Railsです。NameError: 初期化されていない定数
-
[解決済み] Rubyのクラスで未初期化の定数エラーが発生する
-
[解決済み] Herokuの問題 : あなたが探しているページは存在しません。
-
[解決済み] gemのアップデート後、"Asset was not declared to be precompiled in production "でテストが失敗する。
-
[解決済み] Rails / Haml: 投稿フォームを作成するには?
-
[解決済み] Rspec が私のモデルクラスを認識しない。初期化されていない定数エラー
-
[解決済み] ルビーオンレール モデルから明確な値を選択する
-
[解決済み] rails/rubyでgroup_byを使用する。
-
[解決済み] Ruby on Rails の新規セットアップ : "Expected string default value for '--rc'; got false (boolean)".
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み】bcrypt LoadError: Cannot load such file
-
[解決済み】PG::ConnectionBad: fe_sendauth: パスワードが供給されない
-
[解決済み] heroku push rejected, failed to compile Ruby/rails app
-
[解決済み] PG::ConnectionBad - サーバーに接続できませんでした。接続が拒否されました。
-
[解決済み] Devise Admin Roleの追加【終了しました
-
[解決済み] バリデーションなしで属性を更新する方法
-
[解決済み] ルビーオンレール モデルから明確な値を選択する
-
[解決済み] Railsでグループとカウント
-
[解決済み] ActionController::RoutingError: 初期化されていない定数MicropostsController