frisby.jsでネガティブ条件のテストを行う

RESTfull APIのテスティングフレームワークのfrisby.jsを使う際に、レスポンスとして得られるJSONが特定のプロパティを持たないというネガィティブ条件でテストを行う方法です。2016/04/12時点ではドキュメントには明記されていませんでしたが、@0.8.5において動作を確認しました。

frisby.jsのexpectJSONTypesは、その名前のとおり内部で型を厳密比較しています。

if(aType !== eType) {
throw new Error("Expected '" + aType + "' to be type '" + eType + "' on key '" + key + "'");
}

frisby@0.8.5#L1326
従って、{key:undefined}にマッチすることをテストすればOKです。

ここではhttp://api.example.com/usersは、ユーザー一覧のリソースを取得するURLだとします。期待されるレスポンス・ボディは以下のとおりです。

{
    "users":[
        { "name": "foo", "email":"foo@example.com" },
        { "name": "bar", "email":"bar@example.com" }
    ]    
}

ポジティブな条件でテストを行うケースは以下のとおりです。

frisby = require 'frisby'
frisby
    .create 'Users should have appropriate properties.'
    .get 'http://api.example.com/users'
    .expectJSONTypes 'users.*',
        name: String
        email: String
    .toss()

ネガティブな条件でテストを行うケースは以下のとおりです。

frisby = require 'frisby'
frisby
    .create 'Users should not have nonsense properties.'
    .get 'http://api.example.com/users'
    .expectJSONTypes 'users.*',
        nonsence_property1: undefined
        nonsence_property2: undefined
    .toss()

これは、?fields=nameのようなクエリでレスポンスをフィルタするようなAPIのテストに有効だと思われます。