簡體   English   中英

承諾回調中的單元測試邏輯

[英]Unit testing logic inside promise callback

我有一個正在使用茉莉花測試的ES6 / Aurelia應用程序。 我嘗試測試的方法如下所示:

update() {
    let vm = this;
    vm.getData()
        .then((response) => {
            vm.processData(response);
        });
}

其中this.getData是一個返回諾言的函數。

我的規格文件看起來像這樣:

describe('my service update function', () => {
    it('it will call the other functions', () => { 
        myService = new MyService();
        spyOn(myService, 'getData').and.callFake(function() {
            return new Promise((resolve) => { resolve(); });
        });
        spyOn(myService, 'processData').and.callFake(function() { return; });
        myService.update();

        // this one passes
        expect(myService.getData).toHaveBeenCalled();

        // this one fails
        expect(myService.processData).toHaveBeenCalled();
    });
});

我知道為什么會失敗-承諾是異步的,並且在達到期望時尚未解決。

我如何才能將承諾從測試中分解出來,以便可以在回調中測試代碼?

失敗的jsfiddle: http : //jsfiddle.net/yammerade/2aap5u37/6/

我通過返回一個行為類似於承諾而不是實際承諾的對象來解決問題

describe('my service update function', () => {
    it('it will call the other functions', () => { 
        myService = new MyService();
        spyOn(myService, 'getData').and.returnValue({
            then(callback) {
                callback();
            }
        });
        spyOn(myService, 'processData').and.callFake(function() { return; });
        myService.update();

        // this one passes
        expect(myService.getData).toHaveBeenCalled();

        // this one fails
        expect(myService.processData).toHaveBeenCalled();
    });
});

在這里提琴: http : //jsfiddle.net/yammerade/9rLrzszm/2/

這樣做有什么問題嗎?

it((done) => {
  // call done, when you are done
  spyOn(myService, 'processData').and.callFake(function() {
    expect(myService.processData).toHaveBeenCalled();

    done();
  });
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM