コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RSpec内にてRails.envによって振る舞いの変わるものをテストしたい場合の書き方

ただのモックの書き方だが具体例を添えて。

環境

rails (5.2.0)
rspec (3.7.0)

やり方

allowとand_returnを使う

allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production"))

原理

allow({{クラス名}}).to receive({{メソッド名}}).and_return({{代替死体戻り値}})

の形式で戻り値の振る舞いを変えることができる

Rails.env における戻り値の型はただのStringではなく ActiveSupport::StringInquirer

Rails.env
# => "development"
Rails.env.class
# => ActiveSupport::StringInquirer

そのため、それを当てはめてやれば良い

参考サイト

先祖返りのことを英語で表す場合はデグレよりもリグレッションのほうがニュアンスは近そう

そういや先祖返りって言うけど、正しくはなんなんだろう、みたいなトリビア的メモ。

ソフトウェア開発における先祖返りとは

本来の意味

直接の両親でなく,それより遠い祖先の形質が子孫に突然に現れること。 - 先祖返り(せんぞがえり)とは - コトバンク

これから転じて

プログラムの状態が、手を入れる前の状態に戻っちゃうこと - 先祖返りとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

というような期待しているバージョンより前のバージョンの状態になることを指すことが多い

デグレードとは

よく「デグレった」などと呼称されるデグレード、本来の英文の意味は以下

品位を落とす、自分の品位を下げる、品位を下げる - degradeの意味・使い方 - 英和辞典 Weblio辞書

というように劣化したというような意味を指す。転じて

ソフトウェア開発において、プログラムを手直しした際に修正部分以外の個所で不整合・不具合が発生したり、バージョン管理の手抜かりなどによって以前の状態に戻ってしまい、修正済みだったバグが再発したりすること。 - デグレード(でぐれーど) - ITmedia エンタープライズ

というような、前の状態に戻って不具合が発生することを指す。

英語の本来の意味とのズレ

先祖返りとデグレが同じ意味で扱われるが、ちょっとずれている部分があり、「誤って前のバージョンに戻ってしまった」という点は両方にも共通するが、「不具合が発生する」はデグレードにのみ適応する意味合いで、先祖返りはそこまで含まれていない。

先祖返りマッチする英語は「リグレッション

そこで登場するのが「リグレッション」である。

英語本来の意味は

後戻り - Regressionの意味・使い方 - 英和辞典 Weblio辞書

システムの場面ではリグレッション

ソフトウェア開発においては修正済みのバグや不具合が何かの理由により復活すること。システム運用においてはソフトウェアのバージョンアップなどでシステム機能がかえって低下することをいう。 - リグレッション(りぐれっしょん) - ITmedia エンタープライズ

ということで大体先祖返りはこちらのほうが適当な意味合いになる。

参考リンク

sshの鍵を毎回指定するのをショートカットするsshのconfig設定

普通にググりゃでてくるんですが、毎回忘れるのでメモがてら

従来

  • sshに使う鍵は ~/.ssh/nanka_pem
  • ログインするユーザは dareka_user
  • ログインするサーバは 253.254.255.255
ssh -i ~/.ssh/nanka_pem dareka_user@253.254.255.255

configに追記

▼ .ssh/config

Host 253.254.255.255
    User dareka_user
    IdentityFile ~/.ssh/nanka_pem

関連リンク

RailsのViewPartialにて引数確認にdefine?を使うようなケースは本当にそこまでやるか立ち止まって考えて欲しい

人それぞれやり方はあると思うけど、自分はこう思うよ系雑記

環境

rails (5.2.0)

事例

前提の話

レイアウトとレンダリング | Rails ガイド の 「3.4.4 ローカル変数を渡す」にも紹介されているように部分Layoutには変数を渡すことができる。

▼contents/index.html.erb

<%= render :partial => "content", :locals => { title: @content.title , body:@content.body } %>

▼contents/_content.html

<p>タイトルは<%= title %>です</p>
<p><%= body %></p>

みたいな使い方をして locals => ハッシュ で渡すことができる。

問題例

上記の例に加えて、『bodyが設定されていない場合は「本文はありません」と表示したい』という要件が追加されたとする。イメージとしては以下

# 本文がない場合の呼び出し元
<%= render :partial => "content", :locals => { title: @content.title} %>

本文がないけどタイトルのレイアウトはそのまま流用したいという意識が働くと以下のようなコードができる。

▼contents/_content.html

<p>タイトルは<%= title %>です</p>
<% if defined?(body) do %>
  <p><%= body %></p>
<% else %>
  <p> 本文はありません </p>
<% end %>

問題点

この内容がつらいポイントとしては

  • 呼び出されるpartialが状態を気にして複数の振る舞いを持つ
  • 必須な変数、必須ではない変数ができてしまい、partial側で必須な変数を明文化しづらいので、使う側も必要な変数がわかりづらい

解決案

ここでは「DRYにしなくては…」という気持ちが強く働いたがためにpartialが複雑化しているとも考えられるので

  • 無理にDRYを意識してpartialを共通化しない
  • 変数が複数必要になってくるpartialはそれが使いやすいか立ち止まって考える

▼contents/_content.html

<p>タイトルは<%= title %>です</p>
<p><%= body %></p>

▼contents/_no_titlecontent.html

<p>タイトルは<%= title %>です</p>
<p>本文はありません</p>

ケースバイケースだけど、まとめられるからと無理くりまとめると辛くなるので、一度立ち止まって考えるのは必要だと思う。

関連リンク

bin/setup と bin/update の経緯をざっくり見てみる

ふつうのRailsアプリケーションのスライドを見たときにそういえば…と思ったので雑記的なアレ。

f:id:shinkufencer:20190201124020p:plain
このスライド

この2つの意図とは

この仕組みが入ったのはだいぶ前で以下のプルリク

`bin/setup` script to bootstrap applications. by senny · Pull Request #15189 · rails/rails

  • bundle install とか db:setupとかやるのでまとめたいよね
  • 更新とかは bin/setup だとアレだから bin/update にしたいよね

みたいなモチベーションで始まったものの様子。

たしかに新しくJOINしたメンバーがいちいち手順書に則って構築していくのは結構時間対効果がイマイチというのもあるので納得できる仕組み。

いまだと Dockerfile + dockercompose.yml とかで実現できる範囲をカバーできちゃうかもだけど、考え方としては今後も持ち続けたい

関連リンク

Railsアプリ開発の基礎を抑えたあとに読みたいスライド「ふつうのRailsアプリケーション開発」

スライド回顧録です

www.slideshare.net

Rails2系を触って、Rails5で再び戻ってきた自分としてはRailsの根本概念であるMVCの部分やDRYの原則の部分はわかっていても、いまのRailsの基本やデファクトスタンダードのようなものがわかっていなかったので、それを振り返ることができたし、チームと考えを共有するときの骨子のようなものにもなりました。

このスライドの中で一番影響を受けた部分は「足回りは最初に整える」というところで、RspecやRubocopはじめ、そういうくりかえし行うものはちゃんとしっかり整備をしていくのがなによりも近道になるなと実感としても教訓としてもあるので、それは大事にしています。

関連リンク

AppStoreへのリンクをただ作りたいときはLinkMakerを使う

小ネタです。

やりたいこと

AppStoreへのリンクを作りたいので、ストアアプリが立ち上がるURLが知りたい

やり方

iTunes Link Maker に行って

  • ストア国を「日本」
  • メディアタイプを「App」

にしてリンクを貼りたいアプリの名前を検索する

f:id:shinkufencer:20180923003324p:plain

※上記の場合は「ダンジョンメーカー」のリンクを知りたい場合 そうして検索結果をたどるとリンクがでてくるので貼り付ける

f:id:shinkufencer:20180923003527p:plain

貼った例が以下