簡體   English   中英

Typescript / Node.js - 如何模擬傳遞依賴關系進行集成測試?

[英]Typescript / Node.js - How to mock transitive dependencies for integration testing?

假設我有一條由控制器處理的Express路線。 控制器使用服務,服務使用存儲庫與數據源通信。

我想使用Supertest創建一個集成測試來測試該路由:

test -> my Express app -> controller -> service -> repository -> data source

我的問題是我需要模擬存儲庫/數據源,來運行測試! 我想硬編碼一些值,好像它們來自真實的數據源。 我有什么選擇?

在Java世界中,我將使用Spring或Guice的依賴注入,我會用這樣的模擬版本替換存儲庫。 在Typescript / Node.js世界中實現這種模擬的模式是什么?

我想使用普通的Javascript我可以使用Proxyquire及其全局覆蓋要求功能,從測試本身模擬存儲庫。 但我不確定這適用於Typescript。

那么使用Typescript和Node.js從測試文件中模擬“深層”組件(傳遞依賴)的推薦方法是什么?

模塊在第一次加載后被緩存,因此您可以先在測試文件中加載它們,然后使用像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一起使用。 這將最終為您提供應用程序,但在設置了存根依賴項之后!
  • 編寫並運行測試,知道它將使用預定義的數據

暫無
暫無

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

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