量角器中未处理的承诺拒绝警告

时间:2019-01-10 00:10:44

标签: javascript protractor es6-promise

我正在尝试从mongoDB检索值,它给了我 UnhandledPromiseRejectionWarning: MongoError: topology was destroyed

UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().

[DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

以下是按比例缩小的代码版本

CLASS 1

connectToMongoDatabase() {
    try {
        return new Promise((resolve, reject) => {
            mongoclient.connect('mongodb://************************', (err, db) => {
                if (err) {
                    reject(err);
                }
                else {
                    resolve(db);
                }
            });
        });
    }
    catch (err) {
        console.log(err);
    }
}


fetchIssuesFromMongo(dbName, collectionName, query, db) {
    try {
        let dbo = db.db(dbName);
        return new Promise((resolve, reject) => {
            let collection = dbo.collection(collectionName);
            collection.find(query, (err, result) => {
                if (err) {
                    reject(err);
                }
                else {
                    resolve(result);
                    dbo.close();
                }
            });
        });
    }
    catch (err) {
        console.log(err);
    }
}

CLASS 2

executeQuery(issueCount){
   this.CLASS1.connectToMongoDatabase().then((db) => {
       this.CLASS1.fetchIssuesFromMongo(dbName, collectionName, query, db).then((result: any) => {
           expect(result.count()).toEqual(issueCount);
       });
  });
}

规格文件

it('verify result', (done) => {
    CLASS2.executeQuery(6).then(() => {
         done();
    });    
});

我认为测试在this.CLASS1.connectToMongoDatabase()之后失败。 我使用诺言有什么问题吗?我正在兑现所有承诺,并且也有拒绝声明。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

更新课程1

删除try catch,因为它永远不会遵循返回的promise。这是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);
      }
    });
  });
}

修复第2类的executeQuery

在您的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);
  });
}

考虑使用异步/等待。

这通常有助于清理诺言的嵌套链。我喜欢这个。

// 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);
  }
}

在量角器测试中使用异步/等待

最后在量角器测试中,应关闭硒承诺管理器。您将在配置文件中执行此操作。 SELENIUM_PROMISE_MANAGER: false,

接下来,您可以在测试中使用异步/等待。

it('verify result', async () => {
    await CLASS2.executeQuery(6);
});

我不喜欢在您的课程中期望某个条件,因此最好从课程2返回值。因此,我可能会从executeQuery返回一个Promise。

const issueCount = 6;
const queryResult = await CLASS2.executeQuery(issueCount);
expect(queryResult).toEqual(issueCount);

希望有帮助。