2016-01-20 218 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'