我试图在前端自动化中点击一些API路由来使用serenity-js
创建数据,但我认为我遇到的问题是打字稿逻辑相关而不是serenity-js框架相关...
以下是我的工作流程:
使用用户名和密码验证用户身份 将令牌存储在私有属性
中使用标头中的令牌创建帐户 使用有效负载对象 存储在私有属性
中创建的id使用标头中的令牌创建文档 使用有效负载对象,但在其中一个有效负载属性
中传入上面创建的帐户的id数据被插入到db中,但我的ID属性被声明为未定义的字符串,下面的控制台日志清楚地显示了我的id,但是无法弄清楚为什么它不会将该id放在有效负载属性中
这是我的代码:
export class HitThatApi extends CallAnApi {
private token: string;
private TID: string;
private CID: string[] = [];
private CDOCID: string[] = [];
private CTNAME: string;
private lastResponse;
constructor(private axiosInstance: AxiosInstance) {
super(axiosInstance);
}
static as(actor: UsesAbilities): HitThatApi {
return actor.abilityTo(HitThatApi);
}
static at(baseURL: string): HitThatApi {
const axiosInstance: AxiosInstance = axios.create({
baseURL,
timeout: 2000,
headers: {Accept: 'application/json,application/xml'},
});
return new HitThatApi(axiosInstance);
get(url: string, config?: AxiosRequestConfig): PromiseLike<AxiosResponse> {
return this.axiosInstance.get(url, config).then(
fulfilled => this.lastResponse = fulfilled,
rejected => this.lastResponse = rejected.response,
);
}
authenticateWith(uname: string, upassword: string) {
const data = {email: uemail, password: upassword};
return this.post(`.........../login`, data).then(res => {
this.token = res.data.accessToken;
let TID;
for (let i = 0; i < res.data.Ts.length; i++) {
if (res.data.Ts[i].TNAME === 'MY TEST') {
TID = res.data.Ts[i].TID;
}
}
this.TID = TID;
});
}
createAccountWith(accountData: object) {
const data = accountData;
const url = `....../test/${this.TID}/accounts`;
return this.post(url, data).then(res => {
this.CID.push(res.data.MyId);
console.log('THIS IS createAccountWith method MyId----------------------', this.CID );
console.log('THIS IS createAccountWith method STATUS ----------------------', res.status );
});
}
createDocumentWith(documentData: object) {
const data = documentData;
const url = `............/Ts/${this.TID}/documents`;
return this.post(url, data).then(res => {
this.CDOCID.push(res.data.docId);
console.log('THIS IS createDocumentWith method DATA----------------------', data);
console.log('THIS IS createDocumentWith method URL----------------------', url);
console.log('THIS IS createDocumentWith method docId----------------------', this.CDOCID );
console.log('THIS IS createDocumentWith method STATUS ----------------------', res.status );
});
}
createMultipleAccountsWith(multipleAccountDatas: any[]): PromiseLike<void> {
const multipleResults = [];
multipleAccountDatas.forEach((singleAccData) => {
const singleAccountDataObj = {
test1: singleAccData[0],
test2: 'test',
test3: 'test23',
test4: 'test33',
test5: singleAccData[1],
test6:
[
{
test1: 'test',
test2: 'test2',
test3: 'test3',
test4: 'test4',
test5: 'test5',
test6: 'test6',
test7: 'test7',
test8: 'test8',
test9: 'test9'
}
],
};
multipleResults.push(this.createAccountWith(singleAccountDataObj));
});
return multipleResults[multipleResults.length - 1].then(() => Promise.resolve());
// return Promise.resolve();
}
createMultipleDocumentsWith(multipleDocumentDatas: any[]): PromiseLike<void> {
const multipleDocResults = [];
multipleDocumentDatas.forEach((singleDocData) => {
console.log('CID inside createMultipleDocumentsWith ------------------', this.CID);
const singleDocumentDataObj = {
test1: test2,
test2: singleDocData[1],
CID: `${this.CID[0]}`, // this is what is returning undefined
test4: `${this.TID}`,
test5: singleDocData[0],
test6: singleDocData[2],
test7: singleDocData[3],
test8: singleDocData[4],
test9: singleDocData[5],
test10: singleDocData[6],
test11: 'test22',
test12: singleDocData[7],
test13: 'test33',
test14: 'test44',
test15: 'test45',
test16: '',
test17: ''
};
multipleDocResults.push(this.createDocumentWith(singleDocumentDataObj));
});
return multipleDocResults[multipleDocResults.length - 1].then(() => Promise.resolve());
// return Promise.resolve();
}
deleteAccounts(): PromiseLike<void> {
this.CID.forEach((id) => {
const url = `/tests/${this.TID}/testing/${id}`;
this.delete(url);
});
return Promise.resolve();
}
post(url: string, data?: any, config?: AxiosRequestConfig): PromiseLike<AxiosResponse> {
if (this.token) {
return super.post(url, data, Object.assign({},
{headers: {'Auth': this.token}},
config,
));
} else {
return super.post(url, data);
}
}
delete(url: string, config?: AxiosRequestConfig): PromiseLike<AxiosResponse> {
if (this.token) {
return super.delete(url, Object.assign({},
{headers: {'Auth': this.token}},
config,
));
} else {
return super.delete(url);
}
}
}
在这里您可以看到前两行:
THIS IS createAccountWith method CID---------------------- [ '123123123123' ]
THIS IS createAccountWith method STATUS ---------------------- 201
在createdocument方法之外,它成功创建了一个现在存储了Id的帐户,但您也可以看到:
CID inside createMultipleDocumentsWith ------------------ [] ---> this should be 123123123123
理论上的上述代码应打印回CID(123123123123)这是我丢失的原因,为什么它是一个空数组
以下是实际测试的其余输出:
THIS IS createAccountWith method CID---------------------- [ '123123123123' ]
THIS IS createAccountWith method STATUS ---------------------- 201
√ Given that I have created account data with
| Account Number | Account Name |
| test Account - 989 Number | test Account - 989 Name |
CID inside createMultipleDocumentsWith ------------------ [] ---> this should be 123123123123
THIS IS createDocumentWith method DATA----------------------
{
test1: test2,
test2: singleDocData[1],
CID: 'undefined', // this is what is returning undefined and should be 123123123123
test4: TID , //this gets populated correctly
test5: singleDocData[0],
test6: singleDocData[2],
test7: singleDocData[3],
test8: singleDocData[4],
test9: singleDocData[5],
test10: singleDocData[6],
test11: 'test22',
test12: singleDocData[7],
test13: 'test33',
test14: 'test44',
test15: 'test45',
test16: '',
test17: ''
};
我觉得问题可能是因为我正在定义我想要的private CID: string[] = [];
但似乎无法在有效负载对象中抓取它以进行另一个API调用
关于我在代码中做错的任何想法都将不胜感激