Saya memiliki dan layanan sudut yang ingin saya uji. Dalam salah satu metodenya, saya menggunakan $http dari layanan sudut. Saya hanya ingin mengejek fungsi itu (lebih spesifik mock $http.post function) yang akan mengembalikan apa pun yang saya inginkan dan menyuntikkan tiruan ini ke tes layanan saya.

Saya mencoba mencari solusi dan saya menemukan $httpBackend tetapi saya tidak yakin ini dapat membantu saya.

Layanan Saya terlihat seperti itu:

angular.module('app').service('MyService' , function (dependencies) {
    let service = this;
    service.methodToTest = function () {
        $http.post('url').then(function () {
            // Do something
        });
    }
}
  • Saya ingin menguji methodToTest dan menyuntikkan tiruan $http.post()

P.S harap diingat bahwa $http.post() mengembalikan janji jadi saya pikir saya perlu mempertimbangkannya.

0
Sagie 14 Maret 2017, 17:48

2 jawaban

Jawaban Terbaik

Ini terdengar seperti apa $httpBackend untuk.

Anda mungkin juga hanya dapat mengejek $http.post dengan melakukan sesuatu seperti $http.post = jasmine.createSpy(); jika Anda menyuntikkan $http dalam pengujian Anda, tetapi saya tidak tahu.

Jika Anda menggunakan $httpBackend, mungkin contoh ini membantu Anda, dalam tes melati Anda lakukan sesuatu seperti ini

beforeEach(inject(function(_$httpBackend_){
  // The injector unwraps the underscores (_) from around the parameter names when matching
  $httpBackend = _$httpBackend_;

  $httpBackend.whenRoute('POST', 'url')
    .respond(function(method, url, data, headers, params) {

      expect(somevariable).toContain(params.something);

      return [200, '{"progress":601}'];
    });
}));

$httpBackend akan mencegat semua $http.post ke url dan menjalankan fungsi ini. Seharusnya seperti methodToTest yang dikirimkan ke url yang sebenarnya dan mendapatkan nilai pengembalian palsu Anda.

Nilai kembalian menunjukkan kode status http yang berhasil (200) dan mengembalikan apa pun yang Anda masukkan ke dalam argumen kedua sebagai properti data dari respons (di sini response.data == '{"progress":601}'). Yang akan ada di fungsi then. Lihat Bagaimana cara mengejek $http di layanan AngularJS Jasmine test ?

Fungsi expect hanyalah sebuah contoh (tidak diperlukan), untuk menunjukkan kepada Anda bahwa Anda dapat meletakkan klausa expect di sana jika Anda mau.

1
Community 23 Mei 2017, 12:09

P.S harap diingat bahwa $http.post() mengembalikan janji jadi saya pikir saya perlu mempertimbangkannya.

Layanan perlu mengembalikan janji itu:

angular.module('app').service('MyService' , function (dependencies) {
    let service = this;
    service.methodToTest = function () {
        //$http.post('url').then(function () {
        //vvvv RETURN http promise
        return $http.post('url').then(function () {
            // Do something
        });
    }
}

Ketika suatu fungsi menghilangkan pernyataan return, itu akan mengembalikan nilai undefined. Tidak ada cara bahwa layanan dapat menunjukkan keberhasilan atau kegagalan kepada pengguna.

1
georgeawg 14 Maret 2017, 17:03