2016-01-20 216 views
2

我想知道是否可以在測試中使用async/await做這樣的事情。異步/等待嘲諷

隨着定期的承諾,我可以模擬出這樣的單元測試承諾。

class Foo { 
    fn() { 
     this.someService.someFn().then((data) => this.data = data); 
    } 
} 

describe("something", function() { 
    beforeEach(function() { 
     this.instance = new Foo(); 

     // Can this part be mocked out with the same idea, when someService.someFn is async fn 
     this.instance.someService = { 
      someFn: function() { 
       return { 
        then: function(cb) { 
         cb("fake data"); 
        } 
       } 
      } 
     } 

     this.instance.fn(); 

    }); 

    it("a test", function() { 
     expect(this.instance.data).toBe("fake data"); 
    }); 
}); 

(如果我覆蓋的諾言,我沒有處理沖洗或類似的東西)。 但是現在,當FN()將改變這一

class Foo { 
    async fn() { 
     try { 
      this.data = await this.someService.somefn(); 
     } catch() { 

     } 
    } 
} 

覆寫我在之前做過的每一件事情都不會奏效。 所以我在這裏的問題是...我可以做的事情就像我承諾用async/await代碼風格覆蓋所做的一樣。

這裏的想法是,我想模擬出外部依賴項,我可以使用單元測試的函數,比如「someService」。在特定的單元測試中,我期望一些Service.someFn能夠正常工作,並且我可以嘲笑它的響應。其他測試檢查「someFn」的有效性。

回答

2

首先,你的老模擬應該工作得很好,async/await。雖然,最好使用Promise.resolve,而不是與.then方法返回一個對象:

someFn:() => Promise.resolve('fake data') 

但既然你已經使用async/await,你可以利用它在你的測試,以及:

someFn: async() => 'fake data'