2017-08-10 44 views
0

這個問題可能有點令我困惑,但我會盡力讓自己清楚。訪問外部回調函數的這個對象

基本上我正在爲我的Node.JS服務器的數據訪問層做mocha/chai單元測試。我正在使用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)); 
    } 

這就是我的測試與摩卡咖啡:

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是來自回調函數,但我不知道它來自何處或如何爲我的測試設置它。

回答

1

更新: 可以設置功能的this您正在使用的方法的調用.call。 在你的情況下調用callbackthis.changes值將是這樣的:

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

這將設置你的回調函數的值this.changes


this值在API documentation

解釋如果執行成功,this對象將包含名爲lastIDchanges 2個 屬性其含有 最後插入的行ID的值以及分別受該查詢 影響的行數。

這意味着callback函數將始終有this.changes。你不能改變它,除非你手動設置this.changes = something,我不明白你爲什麼要這麼做。

+0

我想在我的測試中做到這一點,因爲我上面顯示的模擬變化情況= 1。在我的測試中,我沒有使用數據庫我創建我的對象來模擬案例,你可以看到在摩卡功能。 –

+1

使用'.call()'調用函數'callback(err)'時,可以設置'this'。例如:'callback.call({changes:1},err)'。這會將「更改」設置爲「1」。 – Maxali

+1

感謝主席,這正是我所尋找的,像魅力一樣工作。 –

0

感謝@Maxali評論,我會後下面的答案:

您可以通過使用.CALL調用回調函數(ERR)時,設定這個()。例如:callback.call({changes:1},err)。這將設置更改爲1

而且注意,我有,我有從箭頭功能的函數聲明insertStatement.run(sqlParams, function(err) {回調這個工作來改變這一行insertStatement.run(sqlParams, err => {。我認爲這是由於在箭頭函數中沒有引用函數內部的對象。