Обновление вашего класса 1
Удалите попытку catch, поскольку она никогда не зацепит возвращенное обещание. Вот изменение для fetchIssuesFromMongo
. Вы должны сделать что-то подобное для connectToMongoDatabase
fetchIssuesFromMongo(dbName, collectionName, query, db) {
const dbo = db.db(dbName);
return new Promise((resolve, reject) => {
const collection = dbo.collection(collectionName);
collection.find(query, (err, result) => {
if (err) {
reject(err); // at this point you should call a .catch
} else {
dbo.close(); // switching the order so the close actually happens.
// if you want this to close at the exit, you should
// probably not do it like this.
resolve(result);
}
});
});
}
Исправление executeQuery
в классе 2
В вашем executQuery
:
executeQuery(issueCount){
// if connectToMongoDatabase is thenable, then you should also call .catch
// you should also return a promise here so your Protractor code can actually
// call .then in `CLASS2.executeQuery(6).then`
return this.CLASS1.connectToMongoDatabase().then((db) => {
this.CLASS1.fetchIssuesFromMongo(dbName, collectionName, query, db).then((result: any) => {
expect(result.count()).toEqual(issueCount);
}).catch(e => {
console.log(e);
});
}).catch(e => {
console.log(e);
});
}
Подумайте об использовании async / await.
Это обычно помогает прояснить вложенную цепочку обещаний. Я предпочитаю это.
// this returns implicitly returns a Promise<void>
async executeQuery(issueCount) {
// valid to use try catch
try {
const db = await this.CLASS1.connectToMongoDatabase();
const result = await this.CLASS1.fetchIssuesFromMongo(dbName, collectionName, query, db);
expect(result.count()).toEqual(issueCount);
} catch(e) {
console.log(e);
}
}
Используйте async / await в тесте транспортира
Наконец, в тесте Protractor вы должны отключить менеджер обещаний селена. Это то, что вы будете делать в вашем файле конфигурации. SELENIUM_PROMISE_MANAGER: false,
Далее вы можете использовать async / wait в вашем тесте.
it('verify result', async () => {
await CLASS2.executeQuery(6);
});
Я не фанат ожидания условия в вашем классе, и, возможно, было бы лучше вернуть значение из класса 2. Поэтому я мог бы возвратить Promise из executeQuery
.
const issueCount = 6;
const queryResult = await CLASS2.executeQuery(issueCount);
expect(queryResult).toEqual(issueCount);
Надеюсь, это поможет.