Rails 3 + mongoDB + haml + RSpec + jQuery のインストール - 2

11th Jul, 2010 (Updated on 31st Dec, 2010) | ruby rails mongodb haml rspec

(2010-08-30: Rails 3.0.0がリリースされたのでそれにあわせて更新。generator関連が少し変わってる)

前回 の続き。

主に FactoryGirlMongoMapper の話。基本的に何も考えなくてもそのまま使えるのだけど。

まず、設定。

spec_helper.rb で、

config.use_transactional_fixtures = true

config.use_transactional_fixtures = false

にする。そうしないと、ActiveRecord::TestFixtures が呼ばれてしまうのだが、ActiveRecordを入れてないので落ちる。

そもそもMongoDBにはトランザクションとかないのでfalseでいい。

後は、ActiveRecordで使う場合と同じように、FactoryGirlの定義の読み込みを spec_helper.rb の中で行う。

Factory.find_definitions

mongoDBにはトランザクションがないので、テストの前にデータを自分で消しておいたほうがいいだろう。

config.before(:each) do
  MongoMapper.database.collections.each {|collection| collection.remove}
end

全体的にはこんな感じ。generatorが作ったものに、上記変更を入れただけ。

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

require 'factory_girl'
Factory.find_definitions

RSpec.configure do |config|
  # == Mock Framework
  #
  # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
  #
  # config.mock_with :mocha
  # config.mock_with :flexmock
  # config.mock_with :rr
  config.mock_with :rspec

  # config.fixture_path = "#{::Rails.root}/spec/fixtures"

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, comment the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = false

  config.before(:each) do
    MongoMapper.database.collections.each {|collection| collection.remove}
  end
end

試しに一つFacotryとテストを書いてみる。

File: spec/factories/entry.rb

Factory.define :entry do |f|
  f.title "MyString"
  f.body "MyString"
end

簡単なお試し用のテストを書いてみる。(テスト自体に意味はない)

require 'spec_helper'

describe Entry do
  it "should create 10 entries" do
    10.times { Factory(:entry) }
    Entry.count.should == 10
  end
end

書いたテストの実行

$ bundle exec rspec spec/models/entry_spec.rb
.

Finished in 0.03308 seconds
1 example, 0 failures

すばらしい!

FactoryGirlで、MongoMapper::Document同士のassociationも問題なく書ける。(ただし、MongoMapper::EmbeddedDocument から 親Documentへのassociationはうまく作ってくれなかった(正格には作ってくれるんだけど、Saveされない))

こんな感じで、Rails 2 + ActiveRecord時代とほとんど変わらない環境が Rails 3 + MongoMapper で、できたかな。