从外部访问回调函数的此对象

时间:2017-08-10 09:08:48

标签: javascript node.js callback mocha chai

我要问的可能有点混乱,但我会尽量清楚。

基本上我正在使用mocha / chai对我的Node.JS服务器的数据访问层进行单元测试。我正在使用bluebird返回一个promise和一个SQLite数据库。

这是我要测试的功能插页:

insert(sqlRequest, sqlParams, sqlRequest2) {
        return new Promise(function (resolve, reject) {
            let insertStatement = this.getDatabase().prepare(sqlRequest);
            let getStatement = this.getDatabase().prepare(sqlRequest2);

            insertStatement.run(sqlParams, err => {
                console.log('this.changes = ', this.changes);
                if (this.changes === 1) {
                    getStatement.all({ $id: this.lastID }, (err, rows) => {
                        if (err) {
                            console.log('entered second err');
                            reject(err);
                        } else {
                            resolve(rows[0]);
                        }
                    });
                } else {
                    console.log('entered first err ');
                    reject(err);
                }

            });
        }.bind(this));
    }

这是我对mocha的测试:

it('insert : Error 2st SQL query', function (done) {

    const daoCommon = new DaoCommon();
    daoCommon.getDatabase = () => {
      return {
        prepare: (sqlRequest) => {
          return {
            all: (sql, callback) => {
              let err = {};
              let rows = null;
              callback(err, rows);
            },
            run: (sqlParams, callback) => {
              let err = undefined;
              callback(err);
            }
          }
        }
      }
    }

    daoCommon.insert('', '', '')
      .then(success => {
        expect.fail();
      })
      .catch(error => {
        expect(error).to.eql({});
      })
      .finally(function () {
        done();
      })
  });

我想模拟this.changes等于1的测试,但我不知道如何设置此值。根据我所读到的,this object来自回调函数,但我完全不知道它来自何处或如何为我的测试设置它。

2 个答案:

答案 0 :(得分:1)

<强>更新 您可以使用方法的this设置要调用的函数的.call。 在您的情况下,使用callback值调用this.changes将如下所示:

var thisObject = {
   changes: 1
};
callback.call(thisObject, err);

这将设置回调函数的值this.changes

this

中解释了this的值
  

如果执行成功,lastID对象将包含两个   名为changescallback的属性,其中包含值   最后插入的行ID和受此查询影响的行数   分别

这意味着this.changes函数将始终具有this.changes = something。除非您手动设置S,否则您无法更改它,我不明白为什么会这样做。

答案 1 :(得分:0)

感谢@Maxali评论,我将在下面发布答案:

  

您可以在使用.call()调用函数回调(err)时设置此项。例如:callback.call({changes:1},err)。这会将更改设置为1

请注意,我必须更改此行insertStatement.run(sqlParams, err => {,其中我将箭头函数的回调转换为函数声明insertStatement.run(sqlParams, function(err) {,以使其正常工作。我假设这是由于箭头函数中没有引用函数本身内部的对象。