[解決済み] factory_botで配列/ハッシュを定義するには?
質問
Dropbox の REST サービスからの戻り値をシミュレートするテストを書こうとしていますが、これはネストされたハッシュを持つ Array のデータを私に返します。
戻り値は内部にハッシュを持つ配列であるため、私のファクトリーをどのようにコード化するかについて困っています。 ここに何が入るのでしょうか?
Factory.define :dropbox_hash do
??
end
Dropboxのデータはこのような感じです。
["/home", {"revision"=>48, "rev"=>"30054214dc", "thumb_exists"=>false, "bytes"=>0, "modified"=>"Thu, 29 Dec 2011 01:53:26 +0000", "path"=>"/Home", "is_dir"=>true, "icon"=>"folder_app", "root"=>"app_folder", "size"=>"0 bytes"}]
そして、RSpecでこのようなファクトリー呼び出しをしたいのです。
Factory.create(:dropbox_hash)
どのように解決するのですか?
私は同じことをすることに興味があり、また、サードパーティ API からのコンテンツのハッシュを使用して動作する私のモデルをテストしていました。factory_girl の組み込み機能のいくつかを使用することで、この種のデータ構造をきれいに構築できることがわかりました。
以下はその例です。
factory :chicken, class:Hash do
name "Sebastian"
colors ["white", "orange"]
favorites {{
"PETC" => "http://www.petc.org"
}}
initialize_with { attributes }
end
ここでの主なトリックは、initialize_withを宣言すると、factory_girlは結果のオブジェクトに属性を割り当てようとしなくなることです。また、この場合、DBストアをスキップするようです。したがって、複雑なものを構築する代わりに、すでに準備されている属性ハッシュをコンテンツとして渡すだけです。ほらね。
実際には使用されないにもかかわらず、クラスに対して何らかの値を指定する必要があるようです。これは、factory_girl がファクトリー名に基づいてクラスをインスタンス化しようとするのを防ぐためです。私はObjectではなく、説明的なクラスを使用することにしましたが、それはあなた次第です。
これらのハッシュファクトリの1つを使用するとき、まだフィールドをオーバーライドすることができます。
chick = FactoryGirl.build(:chicken, name:"Charles")
...しかし、ネストされたコンテンツがあり、より深いフィールドをオーバーライドしたい場合、何らかの深いマージを行うために初期化ブロックの複雑さを増加させる必要があります。
あなたのケースでは、配列とハッシュのデータが混在しており、データ構造の部分間で Path プロパティを再利用する必要があるようです。問題ありません。コンテンツの構造を知っているので、結果の配列を適切に構築するファクトリーを簡単に作成することができます。以下は、私がそれを行うかもしれない方法です。
factory :dropbox_hash, class:Array do
path "/home"
revision 48
rev "30054214dc"
thumb_exists false
bytes 0
modified { 3.days.ago }
is_dir true
icon "folder_app"
root "app_folder"
size "0 bytes"
initialize_with { [ attributes[:path], attributes ] }
end
FactoryGirl.build(:dropbox_hash, path:"/Chickens", is_dir:false)
また、不要な値を省略することも可能です。例えば、Pathとrevだけが本当に必要だとしましょう。
factory :dropbox_hash, class:Array do
path "/home"
rev "30054214dc"
initialize_with { [ attributes[:path], attributes ] }
end
FactoryGirl.build(:dropbox_hash, path:"/Chickens", revision:99, modified:Time.now)
関連
-
[解決済み] モデルで `save` と `save!` はいつ使うのか?
-
[解決済み] レイルズ・ジェネレート」を逆手に取る方法
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Rubyで乱数を取得する方法
-
[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?
-
[解決済み】RSpecのテストを1つだけ実行するには?
-
[解決済み】ハッシュキーを別のキーに置き換える方法
-
[解決済み] カピバラさん曖昧さ解消
-
[解決済み] Ruby on Rails 3でモジュールを作成し、使用するには?
-
[解決済み] RailsのMigrationでカラムをnull => trueにする。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SocketError (getaddrinfo: Name or service not known) - Sunspot/Solr Rails development
-
[解決済み] Rails 3 - link_to を image_tag + text で表示する。
-
[解決済み] REST JSON APIのサーバーとクライアントを分離?[クローズド]
-
[解決済み】rmagick gem install "Can't find Magick-config"...
-
[解決済み] githubからあるgemの特定の「コミット」を取得するには?
-
[解決済み] 既存のRailsカラムのbooleanに:default => trueを追加する。
-
[解決済み] サインアップするためのDeviseルートを削除するにはどうすればよいですか?
-
[解決済み] Rails 3.1。エンジン vs. マウント可能なアプリ
-
[解決済み] rails3プロジェクトからgemsをアンインストールする最良の方法は何ですか?
-
[解決済み] rails - json deviseリクエストで「WARNING: Can't verify CSRF token authenticity」。