2017-06-16 65 views
0

我很難理解我做錯了什麼。sinon mock not catching calls

我有一個JS類這樣:

export default class A { 

    constructor(repository) { 
    this._repository = repository; 
    } 

    async process(date) { 
    // ... 

    this._repository.writeToTable(entry); 
    } 
} 

,我試圖寫一個測試嘲笑使用資料庫sinon.mock

這是我到目前爲止有:

describe('A',() => { 
    describe('#process(date)',() => { 
    it('should work', async() => { 

     const repository = { writeToTable:() => {} }; 
     const mock = sinon.mock(repository); 

     const a = new A(repository); 

     await a.process('2017-06-16'); 

     mock.expects('writeToTable').once(); 
     mock.verify(); 
    }); 
    }); 
}); 

但它總是失敗,說

ExpectationError: Expected writeToTable([...]) once (never called) 

我檢查過(添加了一個console.log),它調用了我在測試中定義的對象。

+0

我不是超級熟悉ES2015異步/等待建造,但在ES5你需要爲測試函數添加一個參數回調函數,測試完成後將調用該函數。這是隱含的嗎?或者,我想如果把'async'放在函數的前面意味着返回一個Promise,那麼當Mocha支持向測試函數返回Promises時,這應該起作用。 – oligofren

回答

1

我在本地運行並閱讀有關sinonjs.org的文檔,您似乎在做正確的事情。

我試圖重寫使用spy你的榜樣,並結束了這樣的事情來獲得通過的測試:

import sinon from "sinon"; 
import { expect } from "chai"; 

import A from "./index.js"; 

describe("A",() => { 
    describe("#process(date)",() => { 
    it("should work", async() => { 
     const repository = { writeToTable: sinon.spy() }; 

     const a = new A(repository); 

     await a.process("2017-06-16"); 

     expect(repository.writeToTable.calledOnce).to.be.true; 
    }); 
    }); 
}); 
+0

謝謝Kristjan。我改變了我的測試,但想明白爲什麼它不起作用,即使它看起來一切正常:/ –