Facebookとの通信をmockするgemを作ってみた

## 概要

[gem作ってGithubに配置するまで(RubyGems.orgへのpush除く)](http://qiita.com/ogawatti/items/e30ec10bec5d02713baa)の続き。

FacebookとのやりとりをMockする[facemock](https://github.com/ogawatti/facemock)というGemを作った。
作ったGemの使い方と、作るときにやったこと(First Commit以降)を紹介しておきます。

## 背景・目的

ユーザ・テストユーザの管理ができるFacebookのMockがほしかった。
(適当なテストユーザを作成、Access Tokenでユーザ取得すると作成したテストユーザが返ってくる、等)
fb_graph-mockや他のmockのgemを使うことも考えたが、ユーザは真面目に扱って欲しかったので、自作することにした。

## 要素技術

 * ruby (2.1.1, 2.1.0, 2.0.0, 1.9.3)
 * gem (versionはそれぞれ最新を使用)
  * rspec
  * simplecov
  * sqlite3
  * activerecord
  * fb_graph
 * github
  * バッジ
  * 絵文字
 * rubygems

## gemの概要

もとのコードをそのまま使えばMockされるようにしたかったため、
MockをonにするとFacebookと通信するgemのネームスペースMockに差し変わる仕組みにした。
今のところFbGraphのみ対応。
ほんの一部のみ。必要になったら拡張していく。

 * Mockのon/off
 * Mock on のときの
  * テストユーザ作成/一覧取得/削除
  * ユーザ取得

(今後koalaとかもやってみたい。)

## 雛形の作成～First Commit

[gem作ってGithubに配置するまで(RubyGems.orgへのpush除く)](http://qiita.com/ogawatti/items/e30ec10bec5d02713baa)を参照。
こちらの記事ではgem作成メインで進めます。

## 使い方

README.md参照。

 * https://github.com/ogawatti/facemock

## First Commit ~ ver 0.0.1 までにやったこと

実装は省略。githubリポジトリを参照

 * [ogawatti/facemock](https://github.com/ogawatti/facemock)

ハマった点はqiita記事作成済み。

 * [クラスを別物に置き換える](http://qiita.com/ogawatti/items/0e69125ef4155241f598)
 * [SQLite3をActiveRecord::Baseからごにょごにょ](http://qiita.com/ogawatti/items/6ed662ac676259950aac)
 * [配列に謎要素](http://qiita.com/ogawatti/items/098e4a931fc2e1576483)
 * [Migration時のログを黙らせる](http://qiita.com/ogawatti/items/103a6dc2da4d080c4359)

ここでは以下について書く。

 * カバレッジ見える化 (simplecovの導入)
 * rakeタスクでテスト (Rakefileの設定追加)
 * ファイルの整理 (空ディレクトリ作成+.gitkeep配置, .gitignoreの設定追加)
 * 色んなバッジ付けてみる
 * RubyGems.orgにpush

### simplecovの導入

ver 0.0.1をコミットするまで(ある程度使えるものになるまで)は、githubにpushしたくない。
いずれはCoveralls等でやるつもりだが、しばらくはsimplecovを使うことにした。

```bash
## simplecovのインストール
$ vi facemock.gemspec  # 次の一行を追加 : spec.add_development_dependency "simplecov"
$ bundle install

## spec_helper.rbに設定追加
$ vi spec/spec_helper.rb
$ cat spec/spec_helper.rb 
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)

require 'simplecov'
SimpleCov.start do
  add_filter '/spec/'
end

require 'facemock'

## rspec実行 & coverage確認
$ rspec 

Facemock
  should have a version number

Finished in 0.00188 seconds (files took 0.08467 seconds to load)
1 example, 0 failures
Coverage report generated for RSpec to /home/aries/personal/applications/tmp/facemock-0.0.0/coverage. 2 / 2 LOC (100.0%) covered.

$ firefox coverage/index.html  #<= ブラウザでcoverageを確認
```

## rakeタスクでテストできるようにする

rspecの設定を書いておく。

```bash
## Rakeファイルに設定追加
$ vi Rakefile
$ cat Rakefile 
require "bundler/gem_tasks"
require "rspec/core/rake_task"

RSpec::Core::RakeTask.new(:spec)

task :default => :spec

## タスク一覧にspecが追加されたことを確認する
$ rake -T
rake build    # Build facemock-0.0.1.gem into the pkg directory
rake install  # Build and install facemock-0.0.1.gem into system gems
rake release  # Create tag v0.0.1 and build and push facemock-0.0.1.gem to Rubygems
rake spec     # Run RSpec code examples

## rakeタスクでテストしてみる
$ rake spec
...
/.../bin/ruby -I/.../gems/rspec-core-3.0.3/lib:/.../gems/rspec-support-3.0.3/lib -S /.../gems/rspec-core-3.0.3/exe/rspec ./spec/facemock_spec.rb

Facemock
  should have a version number

Finished in 0.00134 seconds (files took 0.06351 seconds to load)
1 example, 0 failures
```

## ファイルの整理 (空ディレクトリ作成+.gitkeep配置, .gitignoreの設定追加)

.gitignoreにGemfile.lockを書いていたが、First Commit時に含まれていたので消す。

```bash
## Gemfile.lockを消す
$ git rm —cached Gemfile.lock
$ vi .gitignore  # 使いそうなファイル名を追加
$ cat .gitignore
*.gem
*.rbc
.bundle
.config
.yardoc
Gemfile.lock
InstalledFiles
_yardoc
coverage
doc/
lib/bundler/man
pkg
rdoc
spec/reports
test/tmp
test/version_tmp
tmp
tmp/
db/*.sqlite3
vendor/bundle/
vendor/bundler/
log/*.log

$ git add .
$ git push orign master

## Gemfile.lockが含まれないことを確認する
$ bundle install
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   .gitignore
#
no changes added to commit (use "git add" and/or "git commit -a")
```

dbディレクトリが必要になので作成しておく。
空だとgit addできないので.gitkeepを配置する。

```bash
$ mkdir db
$ git status
# On branch master
nothing to commit (working directory clean)
$ touch db/.gitkeep
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	db/
nothing added to commit but untracked files present (use "git add" to track)
git add .
git commit -m "Added db directory"
git push origin master
```

### 色んなバッジ付けてみる

初Githubリポジトリ作成で、色々使ってみたかった。バッジが欲しかった。のでやってみた。

付けたバッジは、

 * [Travis Ci](https://travis-ci.org/) : CI
 * [Coveralls](https://coveralls.io/) : カバレッジ計測
 * [Gemnasium](https://gemnasium.com/) : 依存gemの更新状況通知
 * [Code Climate](https://codeclimate.com/) : コード品質計測
 * [Version Badge](http://badge.fury.io/) : バージョン表示

色々紹介されているサイトがあるので、ここは参考にしたサイトだけ紹介しておく。

 * Travis CI, Coveralls, Code Climate
  * http://blog.ruedap.com/2013/09/02/travis-ci-coveralls-code-climate-github-badge
 * Gemnasium
  * http://qiita.com/skoji/items/6ff1e1d539416d523e8b
 * Version Badge
  * http://d.hatena.ne.jp/kouji0625/20130914/p1

### コミットメッセージに絵文字を入れるようにする

こんな記事を見つけた。

 * [コミットメッセージの先頭に絵文字いれるのが流行ってんだろうか](http://blog.eiel.info/blog/2014/07/07/emoji-for-git-commit-message/)

同じルールでやってみて、自分に合えば継続、合わなければ止める。
やりかたは簡単で、コミット時に絵文字を指定するだけ。
表示については[リポジトリを参照](https://github.com/ogawatti/facemock)。

```bash
git commit -m ":memo: Added badge to README.md"
```

備考 : 絵文字いっぱいあるんだ・・・。

* http://www.emoji-cheat-sheet.com/


### RubyGemsにpush

色々試してみたので、そろそろversion 0.0.1を登録してみる。

RubyGems.orgは事前にサインアップしておく。
(メールアドレス、ハンドルネーム、パスワードだけで簡単に作成できる)

下記手順では、概要と説明が同じだよ、とか、ホームページがないよ、とか言われた。
後日(多分0.0.2に上げるとき)対応することにする。

```bash
$ mkdir pkg
$ cd pkg

$ gem build ../facemock.gemspec 
WARNING:  no homepage specified
WARNING:  description and summary are identical
  Successfully built RubyGem
  Name: facemock
  Version: 0.0.1
  File: facemock-0.0.1.gem

$ gem push
Enter your RubyGems.org credentials.
Don't have an account yet? Create one at http://rubygems.org/sign_up
   Email:   ogawattim@gmail.com
Password:   
Pushing gem to https://rubygems.org...
Successfully registered gem: facemock (0.0.1)

```


## 参考

 * [Gemfile.lockを消す](http://threetreeslight.com/post/21372833295/git-gemfile-lock)
 * [simplecov追加](http://www.techscore.com/blog/2012/12/25/rails%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%B4%B9%E4%BB%8B-%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%82%AB%E3%83%90%E3%83%AC%E3%83%83%E3%82%B8%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B%E3%80%8Csimp/)
 * [Rakefileにspecタスク追加](https://www.relishapp.com/rspec/rspec-core/docs/command-line/rake-task)
 * [README.mdにバッジ追加](http://blog.ruedap.com/2013/09/02/travis-ci-coveralls-code-climate-github-badge)