(Ada pertanyaan terkait di sini: Tes Jasmine tidak melihat modul AngularJS )
Saya hanya ingin menguji layanan tanpa bootstrap Angular.
Saya telah melihat beberapa contoh dan tutorial tetapi saya tidak ke mana-mana.
Saya hanya memiliki tiga file:
myService.js: tempat saya mendefinisikan layanan AngularJS
test_myService.js: di mana saya mendefinisikan pengujian Jasmine untuk layanan tersebut.
specRunner.html: file HTML dengan konfigurasi jasmine normal dan tempat saya mengimpor dua file sebelumnya dan Jasmine, Angularjs, dan angular-mocks.js.
Ini adalah kode untuk layanan (yang berfungsi seperti yang diharapkan saat saya tidak menguji):
var myModule = angular.module('myModule', []);
myModule.factory('myService', function(){
var serviceImplementation = {};
serviceImplementation.one = 1;
serviceImplementation.two = 2;
serviceImplementation.three = 3;
return serviceImplementation
});
Saat saya mencoba menguji layanan secara terpisah, saya seharusnya dapat mengaksesnya dan memeriksa metode mereka. Pertanyaan saya adalah: bagaimana saya dapat menyuntikkan layanan dalam pengujian saya tanpa bootstrap AngularJS?
Misalnya, bagaimana saya bisa menguji nilai yang dikembalikan untuk metode layanan dengan Jasmine seperti ini:
describe('myService test', function(){
describe('when I call myService.one', function(){
it('returns 1', function(){
myModule = angular.module('myModule');
//something is missing here..
expect( myService.one ).toEqual(1);
})
})
});
beforeEach
kasus banyak ... banyak ... banyak tes yang diperlukan untuk layanan? Menguji model data (layanan) dan memegang banyak variabel global. Terima kasih, C§Sementara jawaban di atas mungkin berfungsi dengan baik (saya belum mencobanya :)), saya sering memiliki lebih banyak tes untuk dijalankan sehingga saya tidak menyuntikkan tes itu sendiri. Saya akan mengelompokkan kasus it () menjadi mendeskripsikan blok dan menjalankan injeksi saya di beforeEach () atau beforeAll () di setiap blok mendeskripsikan.
Robert juga benar bahwa dia mengatakan Anda harus menggunakan injektor $ Angular untuk membuat tes mengetahui layanan atau pabrik. Angular menggunakan injektor ini sendiri dalam aplikasi Anda, juga untuk memberi tahu aplikasi apa yang tersedia. Namun, ini bisa dipanggil di lebih dari satu tempat, dan juga bisa dipanggil secara implisit, bukan eksplisit. Anda akan melihat dalam contoh file pengujian spesifikasi saya di bawah ini, blok beforeEach () secara implisit memanggil injektor untuk membuat hal-hal tersedia untuk ditugaskan di dalam pengujian.
Kembali ke pengelompokan hal-hal dan menggunakan blok sebelumnya, berikut adalah contoh kecilnya. Saya membuat Cat Service dan saya ingin mengujinya, jadi pengaturan sederhana saya untuk menulis dan menguji Service akan terlihat seperti ini:
app.js
Spesifikasi: Pengontrol Kucing
Spesifikasi: Layanan Kucing
EDIT Berdasarkan beberapa komentar, saya telah memperbarui jawaban saya menjadi sedikit lebih kompleks, dan saya juga membuat Plunkr yang mendemonstrasikan Unit Testing. Secara khusus, salah satu komentar menyebutkan "Bagaimana jika Layanan Pengontrol memiliki ketergantungan sederhana, seperti $ log?" - yang termasuk dalam contoh dengan kasus uji. Semoga membantu! Uji atau Retas Planet !!!
https://embed.plnkr.co/aSPHnr/
sumber
Saya perlu menguji arahan yang membutuhkan arahan lain, Google Places Autocomplete , saya berdebat apakah saya harus mengejeknya ... bagaimanapun ini berhasil tanpa membuang kesalahan untuk arahan yang membutuhkan gPlacesAutocomplete.
sumber
Jika Anda ingin menguji pengontrol, Anda dapat menyuntikkan dan mengujinya seperti di bawah ini.
sumber