April 09, 2007
読み込むfixtureを指定する 03:14
- Permalink
- Comments (379)
- Trackbacks (1)
Rails
ひさびさの更新。
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
毎日コミュニケーションズ (2007/03)
売り上げランキング: 985
るびまで読んでたけど、また読むと新しい発見が。
オーム社 (2005/12)
売り上げランキング: 83715
ストラテジー・レターが一番面白かった。
日本実業出版社 (2001/10)
売り上げランキング: 137425
Bookoffでみつけた本。CORBAとかCOMとか。概要ばっかだけど、知識の整理のためにと思ってパラパラめくった。
April 14, 2007
読んだ2 16:26
- Permalink
- Comments (0)
- Trackbacks (0)
book
岩波書店 (1986/07)
売り上げランキング: 161661
お腹いっぱいになった。おかげで(・∀・)も今やリストに見えるようになりました。 改めてSchemeのキレイさに安らぎを覚えた。
次はどうやら売れているらしいOn Lispへ行くぜ。 ネットにあるほうは 以前3章まで読んでたけど、長いページって疲れるから読まなくなったんだよな……。 括弧恐怖症もあったし。
Amazonの在庫復活したね。オレは生協で買ったけど。
April 18, 2007
twitter 19:29
- Permalink
- Comments (0)
- Trackbacks (0)
web
ブログには書きにくい短いネタや、愚痴、うめき声のようなものを吐き出す場所としてとらえることで、 やっとtwitterをオレの中で動機づけることができた。 基本的にこういうのは向かない人間なので楽しさが理解できないぜ……。
「男は度胸、なんでも試してみるのさ」っていうバイタリティのある人は、 ぜひenibloも試してくださいネw
まあオレが積極的にガシガシaddしまくったりすることはないと思うけれども、 followしてくれたらfollow返ししますので、 friendsの賑やかしにでも、これ見た人はひとつaddしてみたらどうじゃろ。 というかこれ以上孤独な場所を作るのはいやだよぉ……。
(´・ω・)つhttp://twitter.com/yazu
April 20, 2007
Feisty Fawn 01:35
- Permalink
- Comments (320)
- Trackbacks (0)
ubuntu
半年に1回のubuntu祭りキタ。
またビデオカードの問題がありそうだけど、 メジャーバージョンアップはwktkが止まらない。 最近はupdate-managerからアップグレードできて簡単だなぁ。
と思ったら「アップグレードの認証に失敗しました。おそらくネットワークまたはサーバの問題です。」 ときた。明日また試す。
April 21, 2007
ubuntu続き 01:42
- Permalink
- Comments (0)
- Trackbacks (0)
ubuntu
結局/etc/apt/sources.listをs/edgy/feisty/gした。 今回は問題なく終わった。
April 23, 2007
Rails以外でRailsのmigrationを使う 23:15
- Permalink
- Comments (2368)
- Trackbacks (0)
Ruby
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
- Permalink
- Comments (2275)
- Trackbacks (0)
Rails
MySQLのmediumblob型を使ってたんだけど、
- rakeでテストするとテスト用データベースのほうがblobになってる
- insertしたデータがblobの上限サイズ64KBで切られる
- データが壊れてテストがエラーで止まる
という状態に今まで数時間いた。辛かった(つД`)
結論としては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
- Permalink
- Comments (2393)
- Trackbacks (0)
Rails
今までバイナリデータは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
- Permalink
- Comments (2317)
- Trackbacks (0)
Rails
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がたくさん出てる……。


