[英]Break promise chain into seperate functions
分為兩個功能:
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))
);
});
};
這個函數確實做了三件事,所以單元測試不是很好。
如何將其分解以使每個任務都可進行單元測試?
嘗試 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()));
}
}
更新 - 根據反饋,我試圖停止使用匿名函數,然后我將嘗試不創建新的承諾。 我在這:
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())
);
}
一種可能的方法:
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())
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.