2017-10-19 72 views
0

我想知道Sinon是否可以用來從另一個內部調用的類中存根函數。Sinon如何使用內部使用的類的函數

例如有一個dbutil類:

class DBUtils { 
    getMyResult(var1, var2){ 
     return new Promise((resolve) => { 
      console.log("calling real getMyResult");//I still see this in the log 
      resolve(var1 + var2); 
     }); 
    } 
} 
module.exports = DBUtils; 

它被稱爲在另一個類dummyService:

const dbUtils = new DBUtils(); 
class dummyService { 
    getResult(var1, var2){ 
    //initially in my code, it returns a promise, 
    //but I have replaced it with your code 
    return dbUtils.getMyResult(var1, var2).then(item =>{ 
     console.log("finish getting my result!"); 
     console.log("here is my result: " + item); 
     return item; 
    }); 
} 
module.exports = dummyService; 

這是我的單元測試文件:(由@Mark_M建議應用代碼變化)

describe("dummy Test", function() { 
var service = new DummyService(); 

const stub = sinon.stub(DBUtils.prototype, 'getMyResult'); 
stub.resolves("1234");  

it("get result", function() { 
    service.getResult("ab", "cd").then(item => { 
     console.log(item); 
    }); 
}); 
}); 

任何人都可以幫助我理解爲什麼我的存根無效嗎?以及如何在dbUtil類中存根getMyResult函數?

================解決方案===================

有兩件事情,我錯過:

  1. 我應該存根DBUtils.prototype
sinon.stub(DBUtils.prototype, 'getMyResult').resolves("1234"); 
  • 存在當我IMPOR一個錯字在我的測試中使用DBUtils。
  • 內dummyService,我有

    const DBUtils = require(./dbutils); 
    

    然而,在測試文件,我有

    const DBUtils = require(./DBUtils); 
    

    不知何故,興農沒有抱怨過,這就是爲什麼我的存根得到從未注入原始方法....在我的測試中更正了導入後,我可以看到現在注入的存根結果。

    +0

    @Mark_M,我最後想出了爲什麼它不像預期的那樣存在......在我的test.js中,我的DBUtils被設置爲required(./DBUtil),它應該是(./dbutil)。所以它實際上是一個錯字....我不知道是否有辦法可以檢測到這種錯誤.... – user2296188

    回答

    1

    由於getMyResult()DBUtils類中的類方法,因此需要存檔DBUtils的原型。像這樣的:

    DBUtils.getMyResult()返回一個承諾。所以你不需要在dummyService.getResult()的承諾中重新包裝它。這使得它容易得多推理(和測試)如果你只是回到原來的承諾:

    dummyService:

    const DBUtils = require('./DBUtils') 
    
    class dummyService { 
        getResult(var1, var2){ 
         const dbUtils = new DBUtils() // <- I assume you are making an instance somewhere 
         return dbUtils.getMyResult(var1, var2).then(item =>{ 
          console.log("finish getting my result!"); 
          console.log("here is my result: " + item); 
          return item // <- if you want to access item in then you need to return it 
         }); 
        } 
    } 
    module.exports = dummyService; 
    

    現在test.js:

    const DBUtils = require('./DBUtils') 
    const DummyService = require('./dummy') 
    const sinon = require('sinon') 
    
    // stub the prototype 
    const stub = sinon.stub(DBUtils.prototype, 'getMyResult') 
    stub.resolves("Stubbed: 1234") 
    
    // make an instance of the service 
    const service = new DummyService() 
    service.getResult("ab", "cd").then(item => { 
        console.log(item) 
        // this prints 'stubbed: 1234' 
        // item is "abcd", which is the returned value of the real getMyResult mothed 
        // the expectation is, item should be "1234" as specified in the stub. 
    }); 
    
    +0

    嗯......你是否將'DBUtils'導入到你的測試模塊?另外,在你的例子中,你正嘗試從'new DBUtils()'返回的存根和實例不起作用。你需要存根實際的類(即從require('DBUtils')返回的東西,然後用'new DBUtils()'創建的那個類的所有實例都應該有stubbed方法。上面的代碼適用於你的問題中的類,所以必須在某處斷開連接。 –

    +0

    對不起,這是我的壞,錯誤不是來自存根(stub)。我解決了它。但是,存根仍未按預期工作。讓我使用代碼更改編輯我的帖子,以便閱讀更容易。再次感謝後續! – user2296188

    +0

    對不起,我錯過了 - getMyResult已經返回一個承諾。所以在你的服務中,你不需要把它包裝在另一個承諾中。讓我看看我是否可以開展工作並舉例說明,然後編輯我的答案。 –