[解決済み] Railsでコンサーンをテストする方法
2022-09-08 11:31:40
質問
私が
Personable
を持つRails 4アプリケーションで
full_name
メソッドがある場合、RSpecを使用してどのようにこれをテストしますか?
concerns/personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
どのように解決するのですか?
あなたが見つけた方法は、確かにちょっとした機能をテストするには有効ですが、かなり壊れやすいようです-あなたのダミークラス(実際には単なる
Struct
である実際のクラスのように動作するかもしれませんし、しないかもしれません。
include
のような振る舞いをするかもしれません。さらに、モデルの懸念をテストしようとしている場合、データベースを適切にセットアップしない限り、オブジェクトの有効性をテストしたり、ActiveRecordコールバックを呼び出したりといったことはできません(ダミークラスにはデータベーステーブルがないため)。さらに、懸念のテストだけでなく、モデル仕様の内部での懸念の動作もテストしたいと思うことでしょう。
そこで、一石二鳥の方法はないでしょうか。RSpecの の共有サンプルグループ を使えば、実際にそれを使っているクラス (例えばモデル) に対して、あなたの懸念をテストすることができます。 と を使えば、それが使われるあらゆる場所でテストができるようになります。そして、テストを一度書くだけで、その関心事を使用するすべてのモデル仕様にそれを含めることができます。あなたの場合、これは次のようになります。
# app/models/concerns/personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
# spec/concerns/personable_spec.rb
require 'spec_helper'
shared_examples_for "personable" do
let(:model) { described_class } # the class that includes the concern
it "has a full name" do
person = FactoryBot.build(model.to_s.underscore.to_sym, first_name: "Stewart", last_name: "Home")
expect(person.full_name).to eq("Stewart Home")
end
end
# spec/models/master_spec.rb
require 'spec_helper'
require Rails.root.join "spec/concerns/personable_spec.rb"
describe Master do
it_behaves_like "personable"
end
# spec/models/apprentice_spec.rb
require 'spec_helper'
describe Apprentice do
it_behaves_like "personable"
end
このアプローチの利点は、ARコールバックの呼び出しのような、ARオブジェクトでなければできないことを懸念して行うようになると、さらに明白になります。
関連
-
[解決済み】Rails: sudo "コマンドが認識されないのはなぜですか?
-
[解決済み] Ruby/Rails の「フック」とは何ですか?
-
[解決済み] 新規ユーザー作成時に ActiveModel::ForbiddenAttributesError が発生する。
-
[解決済み] Ruby on rails "No route matches" (ルートに一致するものがない)。
-
[解決済み] Railsコントローラからホスト名を取得する
-
[解決済み] "render :nothing => true" は空のプレーンテキストファイルを返すのですか?
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Rails 4で懸念事項を使用する方法
-
[解決済み] gemをテストするためにRSpecをセットアップする(Railsではない)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ActionController::InvalidAuthenticityTokenについて
-
[解決済み】Rails 4 RoutingError: ルートが一致しない[POST]。
-
[解決済み] Railsサーバーがポートはすでに使用されていると言う、そのプロセスを殺すにはどうすればよいですか?
-
[解決済み] 新規ユーザー作成時に ActiveModel::ForbiddenAttributesError が発生する。
-
[解決済み] rake db:migrateを使って1ステップだけロールバックする方法
-
[解決済み] rspec 3 - クラスメソッドをスタブ化する
-
[解決済み] RoRにおけるSpringサーバーの機能とは?
-
[解決済み] railsでcheck_boxをcheckedにする方法は?
-
[解決済み] Rails 4で、以前のバージョンのRailsでattr_accessibleを使用していた状況に遭遇した場合、Forbidden Attributes Errorが発生する。
-
[解決済み] RSpecでモジュールをテストする