模块在第一次加载后会被缓存,因此您可以先将它们加载到测试文件中,然后使用 sinon 之类的库对它们进行存根。
考虑以下代码:
// dependency.ts
export function foo(){
return 'foo';
}
// app.ts
import {foo} from './dependency';
export default function main(){
return 'winner ' + foo();
}
您可以通过以下方式测试 app.ts 与 sinon 的依赖关系:
import * as Dependency from '../src/dependency';
import main from '../src/app';
describe('test dependency', () => {
var fooStub;
beforeEach(() => {
fooStub = sinon.stub(Dependency, 'foo');
fooStub.returns('la la lang');
});
afterEach(()=>{
fooStub.restore();
})
it('uses stubbed dependency', ()=>{
expect(main()).to.be.equal('winner la la lang');
});
it('can return different values on other tests', ()=>{
fooStub.returns('moonlight');
expect(main()).to.be.equal('winner moonlight');
});
});
所以基本上对于您的集成测试,您可以在启动应用程序之前导入和存根您的依赖项。我已经创建了一个app.proxy.ts
文件:
- 在
app.proxy
导入您的存储库并将其存根以返回预定义的数据。设置存根后,导入真实app.ts
并导出它。
- 在您的集成测试文件中,导入
app.proxy
而不是 app 并将其与 supertest 一起使用。这将最终为您提供应用程序,但在设置存根依赖项之后!
- 编写并运行测试,知道它将使用预定义的数据