【问题标题】:how should i do asynchronous unit testing?我应该如何进行异步单元测试?
【发布时间】:2016-09-18 23:48:59
【问题描述】:

我正在使用 pg-promise。我是学习者,如果对你来说似乎微不足道,请原谅。我该如何编写单元测试。它错误数据未定义。我一直在 js 文件中建立连接并导出该模块。另一个 js 文件用于查询数据库并获取结果集。代码按预期工作有问题我如何用 mocha 和 chai 编写单元测试。

test1.js
var dbConn= pgp(connUrl);
module.exports = {
    getconnect: function () {
        return dbConn;
    }
};

test2.js

module.exports = {
    getData: function (req, res) {
      db.getconnect().query(sqlStr, true)
                .then(function (data) {  
                    console.log("DATA:", data);
                    return data; 
                  } } }

unittest.js

describe("Test Cases", function (done) {

    it('retrieve response', function (done) {
        var req = {};
        var res = {};
        test2.getData(req, res);    
        // how would i retrieve value of data from test2.js so i can test
        done();
    });
});

如何从 unittest.js 中的 test2.js 中检索“数据”值

【问题讨论】:

  • @vitaly-t。请您建议我应该如何编写单元测试?
  • 您应该问的正确问题 - 如何为异步库编写测试。这与 pg-promise 并不真正相关。同时,您可以查看 pg-promise tests 的示例,它们以库自身测试的方式。
  • 奇怪的是你有一个异步函数,它只记录一个输出但什么都不做。如果输出到标准输出很重要,那么测试它,不要测试函数,因为函数没有返回任何内容,这使得它无法测试。我个人会将该特定测试编写为 bash 脚本,因为这是最简单的方法。如果您必须用 js 编写它,请按照编写 bash 脚本的方式编写它:执行脚本并 grep 它是标准输出。
  • @slebetman 我想测试值“数据”。我不知道如何将“数据”的值返回给 unitest.js

标签: javascript node.js unit-testing pg-promise


【解决方案1】:

您的getData 必须返回承诺。客户端代码将能够识别它完成的那一刻(已解决)。

module.exports = {
    getData: function (req, res) {
      return db.getconnect().query(sqlStr, true)
                .then(function (data) {  
                    console.log("DATA:", data);
                    return data; 
                  } } }

测试:

describe("Test Cases", function () {
    it('retrieve response', function (done) {
        var req = {};
        var res = {};
        test2.getData(req, res).then(function(data){
          // test of data returned
          done(); // finish test
        }).catch(done);// report about error happened
    });
});

如果您不需要模块中的任何数据处理,您可以删除整个 .then 部分而不进行任何功能更改。
但是如果你想预处理数据 - 不要忘记从每个链接的 .then 返回它。

如果您的测试库需要存根用于异步内容,您可以使用async/await 功能来处理它。

it('retrieve response', async function(){
  try {
    var data = await test2.getData(req, res);
    // test data here
  } catch (e) {
    // trigger test failed here
  }
});

或者存根,像这样:

var dbStub = sinon.stub(db, 'getConnect');
dbStub.yields(null, {query: function(){/*...*/}});

【讨论】:

  • 如果您的node.js 版本支持async/await,您可以使用它。添加到答案。
【解决方案2】:

如果你有一个返回承诺的函数,那么你可以在你的测试中使用await

describe("Test Cases", function (done) {
    it('retrieve response', async function (done) {
        try {
          var data = await test2.getData();
          // check data constraints ...
          ...
        } catch(err) {
          ... 
        }
        done(); // finish test
    });
});   

【讨论】:

  • 它会出错,例如 missing )。我检查了每一个我没有遗漏任何括号的地方
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2013-07-16
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
相关资源
最近更新 更多