コードカバレッジに問題があり、理解できません。GoogleジオコーディングAPIを使用して、コールバック関数内で応答が返される座標をクエリしています。Jestはテストに使用されます。
これは、コールバックを使用したテスト可能な呼び出しです。
const geocoder = new google.maps.Geocoder();
geocoder.geocode({address: address}, (results, status) => {
// want to get coverage in this block
// expected test results are OK and logging shows right results
});
これがテストです。テスト時にgoogle.mapsはデフォルトで利用できないため、次のような解決策を見つけました。
it('test', () => {
const constructorSpy = spyOn(google.maps, 'Geocoder');
const geocoder = createSpyObj('Geocoder', ['geocode']);
constructorSpy.and.returnValue(geocoder);
geocoder.geocode = jest.fn((adr, callback) => callback(response, 'OK'));
// expected results that are all OK
});
createSpyObj https://stackoverflow.com/a/45319913/1756136:
const createSpyObj = (baseName, methodNames): { [key: string]: Mock<any> } => {
let obj: any = {};
for (let i = 0; i < methodNames.length; i++) {
obj[methodNames[i]] = jest.fn();
}
return obj;
};
そして、google.mapsはsetupTests.jsで定義されています。テストしていないときは、reactがグーグルマップをロードするとgoogle.mapsが利用できます
window.google = {
maps: {
Geocoder: {},
GeocoderStatus: {
OK: 'OK'
}
}
};
私が試したり調べたりできるアイデアはありますか?カバレッジのみが問題であり、期待される結果は問題ありません。
コードカバレッジは、実際にはこの実装ですでに正しく機能しています。問題は、「if」句しかない「if」句の「else」ステートメントにアクセスしていなかったことです。
また、スパイせずにプロパティとして定義してテストを実行することもできます。
it('test', () => {
Object.defineProperty(google, 'maps', {
value: {
Geocoder: function () {
return {
geocode: jest.fn((adr, callback) => callback(response, 'OK'))
}
}
}
});
// expect..
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加