Ubuntu 13 and Ruby on Rails 4 で、capybara-webkitを使ってcucumberでテスト

必要なパッケージをインストールする

たぶん、このインストールだけで済むはず。

入れている物は、
libqtwebkit-dev
qtwebkitの開発用モジュール
Qtはデスクトップと組込み開発向けのクロスプラットフォームアプリケーション開発フレームワーク
らしい
xvfb
仮想フレームバッファ
ttf-kochi-mincho-naga10 ttf-kochi-gothic-naga10
日本語フォント

済まなかったら以下を追加

Gemfileにgem追加

bundle実行

インストール完了

続いて、実行です。

lib/tasks/cucumber.rakeファイルが出来ているので、開く

test:prepare

というタスクがあるので、この中に以下の様にheadless起動の処理を書く

以上で、cucumberの設定は完了

続いて、サンプル的に。

Googleのトップページへアクセスして、スクリーンショットを撮って終了するという処理を書いてみます。

features/step_definitions/steps.rb

というファイルを作成します。

この中身は以下の様にします。

続いて、

/features/example.feature

というファイルを作成します。

中身は以下の様に。

最後に、cucumberを実行します。

これで、www.google.co.jpのキャプチャが取得出来ましたでしょうか?

Aptana Studio 3でEGitを入れているのに、Aptana Studio 3でインストールされるPortableGitが優先されてしまう問題

Aptana Studio 3でEGitを入れているのに
Aptana Studio 3でインストールされるPortableGitが優先されてしまう問題

ですが

Preferencesの設定の中にある

[Term] – [Git]

という所が二つあると思います。

これは、Aptana Studio 3が内包しているPortable Gitの設定と、EGitの設定が両方出てきているという事です。

で、EGitの方を優先で使いたい場合ですが

[Term] – [Git]のサブオプションがある方がEGitで、サブオプションがない方がPortableGitの方になります。

このPortableGit側の設定の
「Automatically attach our git support to projects added that have git repositories」
と言う設定をOFFにする事で解決する事が出来ます。preference

number_with_delimiter (数値をカンマ区切りで出力)

Ruby on Railsで数値を整形する場合、ActionViewには便利なヘルパーがあります。

number_with_delimiter
です。

[ruby]
number_with_delimiter(12345678) # => 12,345,678
number_with_delimiter("123456") # => 123,456
number_with_delimiter(12345678.05) # => 12,345,678.05
number_with_delimiter(12345678, :delimiter => ".") # => 12.345.678
number_with_delimiter(12345678, :delimiter => ",") # => 12,345,678
number_with_delimiter(12345678.05, :separator => " ") # => 12,345,678 05
number_with_delimiter(12345678.05, :locale => :fr) # => 12 345 678,05
number_with_delimiter("112a") # => 112a
number_with_delimiter(98765432.98, :delimiter => " ", :separator => ",")
# => 98 765 432,98

number_with_delimiter("112a", :raise => true) # => raise InvalidNumberError
[/ruby]

[Ruby on Rails]バッチ処理のrbをテストする方法

バッチ処理として書いたrbファイルをテストする場合

テストケース内で

[ruby]system("ruby バッチファイル")[/ruby]

としても良いが

たとえばTimecopで日付を固定してテストする場合には具合が良くない。

バッチのプロセスが別プロセスで動くため、Timecopの設定がバッチに反映されない。

なので

systemで呼び出している部分を

[ruby]load "バッチファイル"[/ruby]

というように、loadに変えると、そのバッチ処理が都度ロードされるので

テストを実行しているプロセス内でバッチファイルが実行される形になる。

[Rails]updated_atカラムを自動更新しないようにする

RailsのActiveRecordは、updated_atとcreated_atカラムがある場合、created_atには新規作成時、updated_atは新規と更新時に自動で日付が設定されます。

普段はこの動きで便利なんですが

テストをする時などにupdated_atを操作したりしたい。

そんなときは以下のように書けばupdated_atに自動で日付が設定されるのを防ぐ事が出来る。

Railsでx_sendfileを使う

Railsでsend_fileというメソッドがある

これは、ファイルなどをそのまま返す場合に使ったりするが

これを使うとRailsのメモリ使用量が増加していく。

2.1でこの現象が出るが 2.3とかもかも?

なんかメモリを解放してないっぽい感じですが、これに関しては、ほかの方が調べてたりするので深く調べないことにする。

で、解決方法は、x_sendfileを使うのがスマートな気がするので、これを採用する。

導入手順

  • apacheにmod_xsendfileを組み込む
  • apacheの設定ファイルを変更
    とりあえず、設定ファイルにxsendfile用のディレクティブを追加
  • Railsのソースでsend_fileしているところにオプションを指定
    とりあえずテスト用にpaの処理に変更を加える

    という感じで。
  • apache再起動

Railsで日付処理

Railsで日付処理は、意外と簡単に出来たりする。

1日前

1日後

1ヶ月前

1ヶ月後

1年前

1年後

また、本日の開始日時として、たとえば

2011-10-01 00:00:00

という情報を取りたい場合

逆に

2011-10-01 23:59:59

という情報を取りたい場合

月初を得る

月末を得る

redmineのwikiで、テーブル内の文章を改行

redmineにはwikiがついてます。

基本Textile形式で記述する物なので

表を作るときは

という感じで書きます。

が、たとえば趣味が複数あって、途中で改行させたいといった場合に、<br/>タグとかが使えません。

これは、redmineが採用しているライブラリ「redcloth3」の中でbrを許可しないようになっているからです。

どうしても表の中で改行を使いたい場合、この「redcloth3」ライブラリを変更する必要があります。

redmineのlibの中に「redcloth3.rb」というファイルがあるので、これを開き
「ALLOWED_TAGS」という変数を探します。

という感じになっていると思います。

ここに指定したタグが許可されますので、brを追加します。

あとはredmineを再起動するだけです。

rspecでコントローラのテストを書くときのTips

モジュールがインクルードされているか

隠したいパラメータがフィルターされているか

Before filters

レスポンスコード

authenticity_tokenのチェックをスタブでtrueにする

Filtered parameters

ワーニング「warning: peer certificate won’t be verified in this SSL session」が出る

このワーニング
「warning: peer certificate won’t be verified in this SSL session」
は、Net::HTTPライブラリを使用してSSLなページを取得したときに出力される

これを止めるには

Net::HTTPを使用するときに「verify_mode」を設定する

とする

「verify_mode」を設定するときは、「use_ssl」は必須

passengerをインストール

Ruby on Railsの本番実行環境として定着したpassengerです。

では、インストールをしてみます。

まず、passengerをインストールするために必要なモジュール

Ruby

基本中の基本

rubygems

gemでインストールするので、こちらも基本

あとは、以下のライブラリ群が必要になります。

  • GNU C++ compiler
  • Curl development headers with SSL support
  • OpenSSL development headers
  • Zlib development headers
  • Ruby development headers
  • OpenSSL support for Ruby
  • RubyGems
  • Rake
  • rack
  • Apache 2
  • Apache 2 development headers
  • Apache Portable Runtime (APR) development headers
  • Apache Portable Runtime Utility (APU) development headers

手コンパイルでいれるもよし、パッケージで入れるもよし。

準備が整ったら、passengerをインストールします。

次に、passengerのモジュールをコンパイルしてapacheのmodファイルとして組み込みます。

先ほどのライブラリ群が正常にインストールされていれば、以下のような表示が出ます。

一つでもNotFoundが出たらインストールできません
続けて、勝手にコンパイルしていると思います。

コンパイルが完了すれば、以下のような設定のサンプルが表示されるので、それをapacheの設定ファイルに追記します。

/etc/apache2/conf.d/passenger.conf

というファイルを作成し、設定を書き込みます。

LoadModuleの行からPassengerRubyの行までの3行です。

apacheを再起動します。

エラーが無ければ、ここまでは正常に完了です。

次に、動かすプロジェクトの設定をします。

httpd.confに

以下のVirtualHostの設定を追加します。

ServerName、DocumentRoot、Directoryディレクティブは各環境にあった物を各自設定してください。

これで再度apacheを再起動します。

エラーが無ければ、アクセスしてみましょう。

これでプロジェクトをpassengerで起動できました。

 

Rails 2.*系で「rake/rdoctask is deprecated. Use rdoc/task instead (in RDoc 2.4.2+)」エラー

Rails 2.*系のプロジェクトで、rakeコマンドをたたくと、

というエラーが発生することがある。

このエラーは rake のバージョンが新しすぎるのが原因。

基本的にRails3.0.5より前のRailsでは、rakeのバージョンは0.8.7を使う。

新しいrakeが入っている場合

と実行すればよい

ActiveModel

Rails 3からActiveModelが追加されたが、これはどーいうものかというと、

ActiveRecordはテーブルのデータを操作するのに対して

ActiveModelはテーブルの存在しないデータを操作するために使用する。

と思う。

ActiveModelの肝は大きくみて4つくらいあるらしい。

  • アトリビュート
  • コールバック
  • 変更記憶
  • バリデーション

ほかにもいくつか楽しそうな物はあるが、とりあえず、この4つについてREADMEから情報を拾ってみたいと思います。

アトリビュートは、モデル内に項目を作る

コールバック

これで、before_createとかafter_createとか使える

変更記憶

バリデーション

そのほかにも、

errorsインターフェース実装

とか

I18nサポートとか

あります。