2017-01-24 10 views
-1

ブレーク:ブレーク約束チェーンの二つの機能へ

public valJson(json, schemaFile: string) { 
    return new Promise((resolve, reject) => { 
     this.http.get(schemaFile) 
      .toPromise() 
      .then(fileContents => fileContents.json()) 
      .then((schema) => { 
       let ajv = new Ajv({allErrors: true}); 
       ajv.validate(schema, json) ? 
       resolve() : 
       reject(new Error("JSON does not conform to schema: " + ajv.errorsText())); 
      }, err => reject(
       new Error("Unable to get schema file contents:" + err)) 
      ); 
    }); 
}; 

この機能は、そう、それはユニットテストに非常に良いではありませんん3つの物事は本当にあります。

  1. GETファイルの内容
  2. をJSONにそれらを解析し、これは、それらのタスクユニットのそれぞれがテスト可能にするために分割することができますどのようにJSON

を検証しますか?実際の検証一部を壊す時

試み1はうまくいっていません。

public valJson(json, schemaFile: string) { 
    return new Promise((resolve, reject) => { 
     this.http.get(schemaFile) 
      .toPromise() 
      .then(fileContents => fileContents.json()) 
      .then((schema) => { 
       this.valJ(schema) 
      }, err => reject(
       new Error("Unable to get schema file contents:" + err)) 
      ); 
    }); 
}; 

    valJ(schema, json) { 
     let ajv = new Ajv({ allErrors: true }); 
     if ajv.validate(schema, json) 
      return resolve() 
     reject(new Error("JSON does not conform to schema: " + ajv.errorsText())); 
    } 
} 

がアップデート - フィードバック1として、私は無名関数の使用を停止しようとしているし、私は新しいを作成しないようにしようとします約束する。私はここにいる:

public valJson(json, schemaFile: string) { 
    return new Promise((resolve, reject) => { 
    var getFilePromise = this.http.get(schemaFile) 
      .toPromise(); 
    var parseToJsonPromise = getFilePromise 
      .then(contents => this.toJson(contents)); 
    var validateJsonPromise = parseToJsonPromise.then(schema => this.valJ(schema, json, resolve, reject), 
      err => reject(
       new Error("Unable to get schema file contents:" + err)) 
      ); 
    }); 
}; 

toJson(fileContents): any { 
    return fileContents.json() 
} 

valJ(schema, json, resolve, reject): any { 
    let ajv = new Ajv({ allErrors: true }); 
    ajv.validate(schema, json) ? 
     resolve() : 
     reject(new Error("JSON does not conform to schema: " + ajv.errorsText()) 
    ); 
} 
+2

あなたは(それをグーグル)約束アンチパターンをやっています。 '.http.get()。toPromise()'は約束を返しますので、 ''新しいPromise() 'を自分で作成しないでください。代わりに '.http.get()。toPromise()'によって返された約束を返してください。 – slebetman

+0

あなたの匿名機能は匿名である必要はありません。よく知られている入力と期待される出力を持つ、別々に定義された関数としてそれらを分解することができます。次に、個別に宣言された関数の名前を実装に入れます。次に、それぞれを個別にテストすることができます。これが難しくなるのは、親スコープの変数を使用している場合だけです。コードを独立して呼び出すことができる上位スコープで個別に宣言された関数に分解する唯一の方法は、親スコープから直接使用するのではなく、それらの変数を渡すことです。 – jfriend00

+0

codereview.stackexchange.comに属しているので、この質問を議論の対象外としています – Alnitak

答えて

1

一つの可能​​なアプローチ:

public valJson(json, schemaFile: string) { 
    return this.fetchSchema(schemaFile) 
    .then(res => this.parseSchema(res)) 
    .then(schema => this.validateWithSchema(json, schema)); 
} 

fetchSchema(url) { 
    return this.http.get(url).toPromise(); 
} 

parseSchema(response) { 
    return response.json(); 
} 

validateWithSchema(json, schema) { 
    let ajv = new Ajv({allErrors: true}); 
    if (!ajv.validate(schema, json)) { 
    throw new Error("JSON does not conform to schema: " + ajv.errorsText()) 
    } 
} 
関連する問題