1

Я создаю приложение с угловыми углами, и я пишу для него блок-тесты. Yay модульные тесты. Я хочу издеваться над определенным веб-сервисом, который я использую (Filepicker.io), который имеет как REST API, так и Javascript API. В моем коде я использую API Javascript в вызовах, какОтказывание асинхронной веб-службы в тестах с угловым модулем

filepicker.store(file, 
     {  
      options: 'go', 
      right: 'here' 
     }, 
     // filepicker's success callback 
     function(resultObject){ 
      // do stuff with the returned object 
     } 

Я знаю, что я мог бы использовать $ httpBackend поставщика, если бы я взаимодействующий с REST API Filepicker, но поскольку код моего приложения не делает этого, я Интересно, если/как я мог бы высмеять асинхронный API-вызов, подобный этому, в тесте с угловым модулем.

Я просто переопределяю метод хранилища (или весь объект filepicker) в контексте моего набора тестов и заставляю его возвращать фиктивные данные по моему выбору? Это то, что они делают с AngularFire development, с библиотекой, которая переопределяет «реальную» базовую службу Firebase.

Альтернативно, могу ли я обернуть метод в то, что использует $ httpBackend, поэтому я могу использовать все эти удобные методы $ httpBackend, например, отвечать? Какая здесь правильная стратегия? Первый выглядит как более простая и чистая идея.

Вот несколько других вопросов, которые были схожи, но в конечном итоге не ясны, чтобы я мог полностью понять.

AngularJS: unit testing application based on Google Maps API

Unit testing Web Service responses

Mocking Web Services for client layer unit testing

ответ

2

Я бы первым установить SDK в качестве службы для инъекций, поэтому он может быть использован более легко вашим угловом приложение

myApp.factory('FilePicker',function(){ 
    //likely coming from global namespace 
    return filepicker; 
}) 
.controller('ctrl',['FilePicker',function(FilePicker){ 
    //use File picker 
}]; 

Теперь вы должны быть в состоянии ввести макет вместо реальной реализации для ваших тестов. Пример с нашим контроллером

describe('ctrl test', function(){ 
    var ctrl; 

    beforeEach(inject(function($controller){ 
     var mockService={} // here set up a mock 

     ctrl=$controller('ctrl',{FilePicker:mockService}); 
    })); 
}); 
+1

Было бы надлежать вам использовать $ window.filepicker, что позволяет сервис filepicker быть легко издевались, даже если он непосредственно включен где-то вместо того, чтобы с помощью службы, а также предотвращает jshint от жалуясь на глобальные переменные. – Kato