146


REST APIのテストフレームワークであるFrisby.jsに関する質問。  
レスポンスのJSONデータの値が「nullか文字列」である事をテストしたい場合、以下のような形でCustom Matcherが使える。

[code]

    frisby.create('Test using a path as the paramater')
    .get('http://localhost:3000/test')
    .expectJSONTypes('member.*', {
        "name": String,
        "hobby": function(val) { expect(val).toBeTypeOrNull(String); }, // Custom Matcher
        "rank": {
            "name": string, 
            "point": Number
        }
    })
    .toss()
    
[/code]

しかし、JSONがネストしている場合、Custom Matcherがうまく使えない。  
例えば"rank"の"name"がnullか文字列というテストをしようとするとエラーとなってしまう。  
解決方法が分かれば教えて下さい。

[code]

    frisby.create('Test using a path as the paramater')
    .get('http://localhost:3000/test')
    .expectJSONTypes('member.*', {
        "name": String,
        "hobby": String,
        "rank": {
            "name": function(val) { expect(val).toBeTypeOrNull(String); }, // エラーになる 
            "point": Number
        }
    })
    .toss()
    
[/code]

エラーメッセージは以下。

[code]

    1) Frisby Test: Test using a path as the paramater 
        [ GET http://localhost:3000/test ]
     Message:
       Error: Expected 'string' to be type 'object' on key 'name'
     Stacktrace:
       Error: Expected 'string' to be type 'object' on key 'name'
      at _jsonContainsTypes (/home/vagrant/frisby_test/node_modules/frisby/lib/frisby.js:1283:15)
      at _jsonContainsTypes (/home/vagrant/frisby_test/node_modules/frisby/lib/frisby.js:1271:9)
      at jasmine.Matchers.toContainJsonTypes (/home/vagrant/frisby_test/node_modules/frisby/lib/frisby.js:1156:12)
      at /home/vagrant/frisby_test/node_modules/frisby/lib/frisby.js:573:22
      at Array.forEach (native)
      at Function._.each._.forEach (/home/vagrant/frisby_test/node_modules/frisby/node_modules/underscore/underscore.js:81:11)
      at null.<anonymous> (/home/vagrant/frisby_test/node_modules/frisby/lib/frisby.js:572:9)
      at null.<anonymous> (/home/vagrant/frisby_test/node_modules/frisby/lib/frisby.js:1043:43)
    
[/code]


CC BY-SA 3.0
2014-10-26T15:28:44.797
145
2014-12-20T08:06:21.897
2014-12-20T08:06:21.897
33
33
question
javascript rest テスト
Frisby.jsでネストしたJSON ResponseのテストにCustom Matcherが使えない


[`.expectJsonTypes()`は内部的にはJasmineのカスタムmatcherを呼んでいる](https://github.com/vlucas/frisby/blob/3b5f4146ff919a7687ed83501a2deef06d3f2282/lib/frisby.js#L1186)ので、それを利用して最上位の
`"key": object` に対してCustom Matcherを書くことでわりときれいに回避できます:

[code]

    var frisby = require('frisby');
    beforeEach(function() {
      this.addMatchers(jasmine.Matchers.prototype);
    })
    frisby.create('Test using a path as the paramater')
    .get('http://localhost:3000/test')
    .expectJSONTypes("members.*", {
        "name": String,
        "hobby": String,
        "rank": function(val) {
          expect(val).toContainJsonTypes({
            "name": function(val) {
              expect(val).toBeTypeOrNull(String);
            },
            "point": Number
          })
        }
    })
    .toss()
    
[/code]

`beforeEach`
は、ちょっと処理内容が冗長になりますが、Frisbyが内部で定義しているカスタムmatcherが正しくJasmineに登録されていなかったため追加しました。これを追加しない場合、`expect`の結果を`return`し、Frisbyにテストの成否を判定させる必要があります。

なお、この「ネストされたオブジェクトにカスタムmatcherが使えない」問題に関して[バグ報告](https://github.com/vlucas/frisby/issues/93)が[上がっています](https://github.com/vlucas/frisby/issues/93)。修正されれば不要な回避策になります。


CC BY-SA 3.0
2014-10-27T03:42:28.397
146
2014-10-30T07:15:55.460
2014-10-30T07:15:55.460
30
30
145
answer