Saya mulai berpikir ini tidak mungkin, tetapi saya tetap ingin bertanya.
Saya ingin menguji bahwa salah satu modul ES6 saya memanggil modul ES6 lain dengan cara tertentu. Dengan Jasmine ini sangat mudah -
Kode aplikasi:
// myModule.js
import dependency from './dependency';
export default (x) => {
dependency.doSomething(x * 2);
}
Dan kode tes:
//myModule-test.js
import myModule from '../myModule';
import dependency from '../dependency';
describe('myModule', () => {
it('calls the dependency with double the input', () => {
spyOn(dependency, 'doSomething');
myModule(2);
expect(dependency.doSomething).toHaveBeenCalledWith(4);
});
});
Apa yang setara dengan Jest? Aku merasa ini hal yang sangat sederhana untuk dilakukan, tapi aku sudah mencabuti rambutku untuk mencari tahu.
Yang paling dekat saya datang adalah dengan mengganti import
s dengan require
s, dan memindahkannya di dalam tes / fungsi. Tak satu pun dari hal-hal itu yang ingin saya lakukan.
// myModule.js
export default (x) => {
const dependency = require('./dependency'); // yuck
dependency.doSomething(x * 2);
}
//myModule-test.js
describe('myModule', () => {
it('calls the dependency with double the input', () => {
jest.mock('../dependency');
myModule(2);
const dependency = require('../dependency'); // also yuck
expect(dependency.doSomething).toBeCalledWith(4);
});
});
Untuk poin bonus, saya ingin semuanya berfungsi ketika fungsi di dalamnya dependency.js
adalah ekspor default. Namun, saya tahu bahwa memata-matai ekspor default tidak berfungsi di Jasmine (atau setidaknya saya tidak pernah bisa membuatnya berfungsi), jadi saya tidak mengulurkan harapan bahwa itu mungkin di Jest juga.
sumber
import
s kerequire
s untuk saat ini. terimakasih untuk pemberitahuannya.Jawaban:
Saya sudah bisa menyelesaikan ini dengan menggunakan hack yang melibatkan
import *
. Ia bahkan berfungsi untuk ekspor bernama dan default!Untuk ekspor bernama:
Atau untuk ekspor standar:
Seperti yang ditunjukkan Mihai Damian dengan tepat di bawah ini, ini memutasikan objek modul
dependency
, dan karenanya akan 'bocor' ke pengujian lain. Jadi, jika Anda menggunakan pendekatan ini, Anda harus menyimpan nilai asli dan kemudian mengaturnya kembali setelah setiap tes. Untuk melakukan ini dengan mudah dengan Jest, gunakan metode spyOn () alih-alihjest.fn()
karena mendukung dengan mudah mengembalikan nilai aslinya, karena itu hindari sebelum disebutkan 'bocor'.sumber
dependency
berada pada file yang sama denganmyModule
, itu tidak akan berfungsi.Anda harus mengejek modul dan mengatur sendiri mata-mata:
sumber
babel-plugin-jest-hoist: The second argument of jest.mock must be a function.
Jadi kodenya bahkan tidak bisa dikompilasi.jest.mock
relatif terhadap file uji.__esModule: true
ke objek tiruan. Itu adalah bendera internal yang digunakan oleh kode yang ditranskrip untuk menentukan apakah itu adalah modul es6 yang ditranskrip atau modul commonjs.jest.mock('../dependency', () => ({ default: jest.fn() }))
Untuk mengejek ekspor standar modul ketergantungan ES6 menggunakan lelucon:
Pilihan lain tidak berfungsi untuk kasus saya.
sumber
Menambahkan lebih banyak ke jawaban Andreas. Saya memiliki masalah yang sama dengan kode ES6 tetapi tidak ingin mengubah impor. Itu tampak berantakan. Jadi saya melakukan ini
Dan menambahkan dependency.js di folder "__ mocks __" sejajar dengan dependency.js. Ini berhasil untuk saya. Juga, ini memberi saya opsi untuk mengembalikan data yang sesuai dari implementasi tiruan. Pastikan Anda memberikan jalur yang benar ke modul yang ingin Anda tiru.
sumber
__mocks__/translations.js
berkas hanya bawaan eksporjest.fn()
dalam sesuatu seperti:export default jest.fn((id) => id)
jest.genMockFromModule
untuk menghasilkan tiruan dari modul. facebook.github.io/jest/docs/…export default jest.genMockFromModule('../dependency')
akan memiliki semua fungsi yang ditugaskandependency.default
setelah memanggil `jest.mock ('.. dependency'), tetapi jika tidak berperilaku seperti yang diharapkan.expect(???)
Penerusan cepat ke 2020, saya menemukan tautan ini sebagai solusinya. hanya menggunakan sintaks modul ES6 https://remarkablemark.org/blog/2018/06/28/jest-mock-default-named-export/
Juga satu hal yang perlu Anda ketahui (yang membuat saya perlu waktu untuk mencari tahu) adalah bahwa Anda tidak dapat memanggil jest.mock () di dalam tes; Anda harus menyebutnya di tingkat atas modul. Namun, Anda dapat memanggil mockImplementation () di dalam masing-masing tes jika Anda ingin menyiapkan tiruan yang berbeda untuk tes yang berbeda.
sumber
Pertanyaannya sudah dijawab tetapi Anda dapat menyelesaikannya seperti ini:
dependency.js
myModule.js:
myModule.spec.js:
sumber
Saya memecahkan ini dengan cara lain. Katakanlah Anda memiliki dependency.js Anda
Saya membuat file depdency.mock.js selain itu dengan konten berikut:
dan dalam tes, sebelum saya mengimpor file yang memiliki ketergantungan saya gunakan:
sumber