Frisby.jsを使用したWeb APIテスト

# 環境
## パッケージ
**Frisby.js**
https://www.npmjs.com/package/frisby
http://frisbyjs.com/

**jasmine-node**
https://www.npmjs.com/package/jasmine-node
http://jasmine.github.io/

## 環境構築
```
$ npm install frisby
$ npm install jasmine-node -g
```

# テスト作成
## 記述
```js:*spec.js
var frisby = require('frisby');

frisby.create('Title')
// 色々準備して…
.toss();
```

## Frisby.jsメソッド

|メソッド||
|:--|:--|
|create(msg)||
|reset()|opts[^1].requestが対象|
|toss(retry)||
|waits(millis)||
|retry(count, backoff)|backoffは[ms]。<br>POSTの場合は無効。<br>opts[^1].retry,opts[^1].retry_backoff|
|responseType(type)|※用途不明|

### Global setup

|メソッド||
|:--|:--|
|globalSetup(opts)||

[^1]: globalSetup(opts)

opts

```js:
{
  request: {
    headers: {},
    inspectOnFailure: false,
    json: false,
    baseUri: '',

    // 認証(既定値:undefined)
    auth: {
      user: '',
      password: '',
      sendImmediately: false
    }
  },

  // timeout(既定値:undefined)
  timeout: 5000,
  // retry(既定値:undefined)
  retry: 0,
  retry_backoff: 1000
};
```

### HTTP Requests

|メソッド||
|:--|:--|
|get([uri, params])||
|patch([uri, data, params])||
|post([uri, data, params])||
|put([uri, data, params])||
|delete([uri, data, params])||
|head([uri, params])||
|options([uri, params])||
|auth(user, pass, digest)|HTTP Requestメソッドの後に設定。<br>opts[^1].auth|
|timeout(t)|||

※Multipartについては、[httpbin_multipart_spec.js](https://github.com/vlucas/frisby/blob/master/examples/httpbin_multipart_spec.js)を参照

### Expectations

|メソッド||
|:--|:--|
|expectMaxResponseTime(milliseconds)||
|expectStatus(statusCode)||
|expectHeader(header, content)||
|expectHeaderContains(header, content)||
|expectHeaderToMatch(header, pattern)||
|expectBodyContains(content)||
|expectJSONTypes(path, jsonTest)|pathは省略可|
|expectJSON(path, jsonTest)|pathは省略可|
|expectJSONLength(expectedLength)||
|expectJSONSchema(path, jsonSchema)|[jsonschema](https://www.npmjs.com/package/jsonschema)を使用|
|not()||

jsonTestにはfunction(val)を指定可([Write Tests](http://frisbyjs.com/#Write_Tests)参照)

```js:
// jsonTestのサンプル
{
  // 第1階層のvalueにはfunction(val)を指定可
  place: function(val) { expect(val).toMatchOrBeNull("Oklahoma City, OK"); },
  user: {
    // ※function(val)を指定しても呼び出されない
    location: function(val) { expect(val).toEqual("Oklahoma City, OK"); }
  }
}
```

[^2]: すべてのexpectXXX()

### Helpers

|メソッド||
|:--|:--|
|after(cb)|指定した順番でcbが呼び出される|
|afterJSON(cb)|指定した順番でcbが呼び出される|
|exceptionHandler(fn)|expect[^2],after[^3]での例外を捕捉|

[^3]: after(cb),afterJSON(cb)

### Headers

|メソッド||
|:--|:--|
|addHeader(header, content)||
|addHeaders(headers)||
|removeHeader(key)||

### Inspectors

|メソッド||
|:--|:--|
|inspectRequest()||
|inspectResponse()||
|inspectStatus()||
|inspectHeaders()||
|inspectBody()||
|inspectJSON()||

### Response setters
※Matcherテスト用

|メソッド||
|:--|:--|
|setResponseJSON(json)||
|setResponseBody(body)||
|setResponseHeaders(headers)||
|setResponseHeader(key, value)||

※戻り値は引数で設定した値

## 追加のMatcher
- toMatchOrBeNull()
- toMatchOrBeEmpty()
- toBeType()
- toBeTypeOrNull()
- toBeTypeOrUndefined()
- toContainJson()
- toContainJsonTypes()

version 0.8.5

# テスト実施

## 実行
```
$ jasmine-node .
```
- ファイル名がspec.jsで終わるファイルが対象
- ファイル名昇順にすべてのspec.jsファイルを実行しテストを作成する(※逐次ではない)
- 作成したテストを順次実行する(toss()メソッドを呼び出した順)
- after()[^3]で作成したテストは--verboseの一覧には表示されない