2016-10-11 12 views
5

Pracuję nad projektem React-Native przy użyciu TypeScript. Aby napisać moje testy jednostkowe, chciałbym użyć babel-plugin-rewire, aby sfałszować moje importowanie modułów. Jednak TypeScript dodaje przyrostek _1 na końcu importu podczas konwersji z ES6 na ES5, co powoduje przerwanie mojego kodu testowego.Używanie programu Rewire z TypeScript

Rozważmy następujący:

import Test from 'test-file'; 

to może być przekształcony przez maszynopis do:

var test_file_1 = require('test-file'); 

mock klasy badanie przy użyciu wtyczki ReWire musiałbym napisać:

ComponentToTest.__Rewire__('Test', TestMock); 

, ale od czasu, gdy import został zmieniony, spowoduje to przerwę.

Chociaż jest to by design, chciałbym wiedzieć, czy są jakieś obejścia.

Dzięki.

+0

Jak udało ci się importować przetestowany moduł do specyfikacji plik (np. 'import {SomeClass, __Rewire__} z '../ src/SomeClass';')? Kiedy próbuję uruchomić test, kompilator wypisze następujący błąd '" SomeClass "nie ma wyeksportowanego elementu '__Rewire __''. P.S. Pliki spec są również napisane w TypeScript. –

Odpowiedz

2

Nie wiem o Babel-Plugin-Rewire, ale jeśli korzystasz z TypeScript z samą Rewire, w tym ze skompilowania modułów ES6 do ES5, możesz z łatwością sfałszować wygenerowany plik bezpośrednio.

tj. To powinno działać:

ComponentToTest.__set__('test_file_1', { default: TestMock }); 

To robi wtedy zależy przyrostek _1, które mogłyby wiarygodnie zmiany w późniejszych wydaniach maszynopis lub jeśli dokonać pewnych zmian w samym kodzie maszynopis. Myślę, że to dość niskie ryzyko. Przykładem

Pełna Rewire + TS:

Component.ts:

import DefaultComponent from "other-component"; 
import { IndividuallyExportedComponent } from "yet-another-component"; 

// ... Do something worth testing 

komponentowego Test.ts:

import rewire = require("rewire"); 
let RewiredComponent = rewire("../src/Component"); 

let defaultMock = { /* Make a mock of your dependency */ }; 
RewiredComponent.__set__('other_component_1', { 
    default: defaultComponentMock 
}); 

let individuallyExportedMock = { /* Make a mock of your dependency */ }; 
RewiredComponent.__set__('yet_another_component_1', { 
    IndividuallyExportedComponent: individuallyExportedMock 
}); 

// RewiredComponent has the wrong type now. YMMV, but I'm doing type-wrangling 
// that looks something like: 

import * as RealComponent from "../src/Component"; 
let Component: typeof RealComponent & typeof RewiredComponent = <any> RewiredComponent; 

// 'Component' now has the same type as the real module, plus the 
// .__set__ etc methods from Rewire. 
+0

Czy możesz również wspomnieć o zalecanym sposobie korzystania z TypeScript z samą Rewirem? –

+0

Dokładnie jak tam - po prostu udawaj wygenerowaną nazwę pliku i zawiń eksport. Przełożę odpowiedź na pełny przykład. –

Powiązane problemy