83's

Top > Archives > 2007 > April

April 09, 2007

読み込むfixtureを指定する 03:14

ひさびさの更新。

Railsのテストで以下のようにテーブル名を指定すると、

fixtures :songs, :fighters

songs.ymlとfighters.ymlが読まれるわけだけど、 例えばすでにsongs.ymlが他のテストのためにかっちり作りこまれてて使いにくいとか、 「あーよくわかんないデータがたくさん書いてあって 少しでもいじるとほかのテストできっとこけるに違いない」 って場面に遭遇するのはオレだけじゃないはず。

「それはおまいのテストの仕方がダサいからだよm9(^Д^)プギャー」 という声が聞こえてきそうではあるけど、 テストファイルごとにfixturesファイルも使い分けたい場合ってあると思うんだ(´・ω・`)

test_helper.rbに

class Fixtures
  cattr_accessor :fixture_paths

  self.fixture_paths = {}

  alias old_read_fixture_files read_fixture_files

  def read_fixture_files
    if fixture_paths[table_name]
      @fixture_path = File.join(File.dirname(@fixture_path), fixture_paths[table_name])
    end

    old_read_fixture_files
  end
end
 
class Test::Unit::TestCase
  def self.set_fixture_files(files)
    Fixtures.fixture_paths.update(files.inject({}) {|h, (k, v)| h[k.to_s] = v.to_s; h })
  end
end

としておくと、

class FooControllerTest < Test::Unit::TestCase
  fixtures :songs, :fighters
  set_fixture_files :songs => :foo_songs, :fighters => :foo_fighters
  ...

という具合に書けるようになる。やった! やったよー!

fixturesでテーブル名を指定して、set_fixture_filesでテーブルと対応するfixtureファイルを指定。 「fightersテーブル用のfixtureはfoo_fighters.ymlから読んでね」と覚える。

多分動く。今日授業だからもう寝ないとやばい。去年しっかりとっておけばよかった……。

読んだ 14:56

Rubyist Magazine出張版正しいRubyコードの―RubyistのRubyistによる、Rubyistとそうでない人のための
青木 峰郎
毎日コミュニケーションズ (2007/03)
売り上げランキング: 985

るびまで読んでたけど、また読むと新しい発見が。

Joel on Software
Joel on Software
posted with amazlet on 07.04.09
Joel Spolsky 青木 靖
オーム社 (2005/12)
売り上げランキング: 83715

ストラテジー・レターが一番面白かった。

図解でわかる分散オブジェクト技術のすべて―ネットワーク&システム構築
小泉 修
日本実業出版社 (2001/10)
売り上げランキング: 137425

Bookoffでみつけた本。CORBAとかCOMとか。概要ばっかだけど、知識の整理のためにと思ってパラパラめくった。

April 14, 2007

読んだ2 16:26

Common Lisp 入門
Common Lisp 入門
posted with amazlet on 07.04.14
湯浅 太一 萩谷 昌己
岩波書店 (1986/07)
売り上げランキング: 161661

お腹いっぱいになった。おかげで(・∀・)も今やリストに見えるようになりました。 改めてSchemeのキレイさに安らぎを覚えた。

次はどうやら売れているらしいOn Lispへ行くぜ。 ネットにあるほうは 以前3章まで読んでたけど、長いページって疲れるから読まなくなったんだよな……。 括弧恐怖症もあったし。

Amazonの在庫復活したね。オレは生協で買ったけど。

April 18, 2007

twitter 19:29

ブログには書きにくい短いネタや、愚痴、うめき声のようなものを吐き出す場所としてとらえることで、 やっとtwitterをオレの中で動機づけることができた。 基本的にこういうのは向かない人間なので楽しさが理解できないぜ……。

「男は度胸、なんでも試してみるのさ」っていうバイタリティのある人は、 ぜひenibloも試してくださいネw

まあオレが積極的にガシガシaddしまくったりすることはないと思うけれども、 followしてくれたらfollow返ししますので、 friendsの賑やかしにでも、これ見た人はひとつaddしてみたらどうじゃろ。 というかこれ以上孤独な場所を作るのはいやだよぉ……。

(´・ω・)つhttp://twitter.com/yazu

April 20, 2007

Feisty Fawn 01:35

半年に1回のubuntu祭りキタ。

またビデオカードの問題がありそうだけど、 メジャーバージョンアップはwktkが止まらない。 最近はupdate-managerからアップグレードできて簡単だなぁ。

と思ったら「アップグレードの認証に失敗しました。おそらくネットワークまたはサーバの問題です。」 ときた。明日また試す。

April 21, 2007

ubuntu続き 01:42

結局/etc/apt/sources.listをs/edgy/feisty/gした。 今回は問題なく終わった。

April 23, 2007

Rails以外でRailsのmigrationを使う 23:15

Rails以外でDBのテーブル作るときに、 Railsのmigrationでないと我慢できない患者さんはいますか。

(;´Д`)ノ

メモっとく。

% rake migrate
% rake migrate VERSION=0

とかしたいので、Rakefileを作る。

# Rakefile
require "rubygems"
require "active_record"

ActiveRecord::Base.establish_connection(...省略...)

# セットしてないとnil.infoで落ちるから注意
require 'logger'
ActiveRecord::Base.logger = Logger.new(STDOUT)

task :migrate do
  ActiveRecord::Migrator.migrate('db/migrate', ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
end

db/migrateと指定しているのは、マイグレーションファイル(001_xxx.rb)のあるディレクトリ。 Rakefileからの相対パスだ。 ここにRailsと同じようにファイル名つけて同じように書いて放りこんでおけばokみたい。

こうしてSQLがなかなか身につかないオレ……。

April 29, 2007

Railsでデータベース依存の型を使ってたらテストで悲劇が 05:43

MySQLのmediumblob型を使ってたんだけど、

  1. rakeでテストするとテスト用データベースのほうがblobになってる
  2. insertしたデータがblobの上限サイズ64KBで切られる
  3. データが壊れてテストがエラーで止まる

という状態に今まで数時間いた。辛かった(つД`)

結論としてはconfig/environment.rbに

  # Use SQL instead of Active Record's schema dumper when creating the test database.
  # This is necessary if your schema can't be completely dumped by the schema dumper, 
  # like if you have constraints or database-specific column types
  # config.active_record.schema_format = :sql

とあるように、データベース特有の型を使うときはconfig.active_record.schema_format = :sql としないといけない。 実際にはActiveRecord::Base.schema_formatみたいなんだけど、config〜でもいいのか。 このへんはまだ良くわかってない。

とりあえず早い話がmigrationでt.column :name, :typeとすんなり書けない型を使うときは:sqlとする。 ちなみにデフォルトは:rubyになっている。

今までdb/schema.rbとかdb/development_structure.sqlは何に使ってるんだろうと思ってたけど、 ここで使い分けされてるみたい。

ざっと見た感じ、rakeからテストを実行するときは、事前に

  • :rubyのときはdevelopmentのデータベースから汎用性のあるschema.rbを吐き出して、これを使ってテスト用データベースを作る
  • :sqlのときはdevelopmentのデータベースからshow create table ...でdevelopment_structure.sqlを吐き出して、これを使ってテスト用データベースを作る

ということが行われているみたい。

今回のはまりどころはmediumblob型がschema.rbでは:binaryになっていて、 :binaryはMySQLではblob型なのでテスト用データベースではblobになってた。

バイナリデータをfixtureに書く 06:23

今までバイナリデータはtestの前に自分で突っ込んでsaveとかしてたんだけど、 ダサいのでそれもfixtureに書けるようにしてみた。

entry1:
  id: 1
  blog_id: 1
  date: <%= Time.now.to_s(:db) %>
  image: <%= embed_file('dummy.jpg') %>
  ・
  ・
  ・

みたいに書ける。でもどうなんだろう。ERB展開したらものすごくデカい文字列に……。

とりあえずメモ。

test_helper.rbのトップレベルな位置に

def embed_file(file_name)
  " !binary |\n" + Base64.encode64(File.read("#{RAILS_ROOT}/test/fixtures/files/#{file_name}")).gsub(/^/, '    ')
end

を追加。

でもこのままだとfixtureをデータベースに流し込むときにbinaryなデータが ただの文字列としてinsertされてしまうので、 Fixture#value_listをtest_helper.rbで上書きしてみた。

class Fixture
  def value_list
    columns = @class_name.constantize.columns.inject({}) {|h, c| h[c.name] = c; h }
    @fixture.map do |k, v| 
      ActiveRecord::Base.connection.quote(v, columns[k]).gsub('\\n', "\n").gsub('\\r', "\r")
    end.join(", ")
  end
end

これでカラムのタイプに応じて(というかカラムが:binaryのときは)x'〜'としてinsertくれる。

あ、一応オレのActiveRecordは1.14.4で、MySQL使ってます……。

Railsも1.2.3にしてみたらイミフなエラー出まくったのでビビって未だに1.1.6で放置。 Rubyのバージョンも関係するんだろうか……。手元のubuntu(edgy)のRubyは1.8.4なんですが。

お、もしかしてと思って1.15.3見たら、Fixture#value_listは上と似たようなことになってる。 さっさとバージョンあげるか……。起きたらエラーと戦うことにする。

Rails 1.1.6 -> 1.2.3にしたら出てきた問題 18:48

feistyにしてRubyは1.8.5になった。

routes.rb

ActionController::Routing::Routes.draw do |map|
  map.image ...
end

これ↑でimage_urlの他にimage_pathというヘルパーメソッドが定義されるようになった。

image_url #=> "http://host/path"
image_path #=> "/path"

で、これがActionView::Helpers::AssetTagHelperのimage_pathを上書きしてしまって、 それを呼んでいるimage_tagがおかしくなる模様。しょうがないのでmap.imageを別の名前に変更。 というかしっかり名前つけろってことですね……。

image_pathの他にはjavascript_path, stylesheet_pathてのもあるので使わないように 注意しないとなー。

assert_tag

:contentが厳密になった。

# <title>assert test</title>

assert_tag :tag => 'title', :content => 'test'        #=> だめ
assert_tag :tag => 'title', :content => /test/        #=> ok
assert_tag :tag => 'title', :content => 'assert test' #=> ok

この2つ直したら通った。いや、あと1個あった。それからDEPRECATION WARNINGがたくさん出てる……。