2015-08-10 1 views
0

Я хочу сделать тест e2e услуги angularjs, не издеваясь над $ http call. Вызов fsSvc.getSubject приводит к нескольким встроенным асинхронным вызовам, что в конечном итоге заканчивается вызовом функции обратного вызова, где я выполнил вызов.

Не уверен, что это не работает - не стоит $ HTTP сделать призыв к реальным, если его не издевались ?:

it('should pass auth', function(done) { 
     inject(function (fsSvc) { 
      var cb = sinon.spy(); 
      stubs.updateRecord = sinon.stub(dataSvc, 'updateRecord'); 

      dataSvc.LO.famSrch.access_token_expires = false; 

      fsSvc.getSubject("abc", function(err, data) { 
       console.log("err:" + err); 
       done(); 
       cb(); 
      }); 

      $timeout.flush(); 
      expect(dataSvc.LO.famSrch.discovery).to.not.be.undefined; 
      expect(dataSvc.LO.famSrch.discovery.links).to.not.be.undefined; 
      expect(dataSvc.LO.famSrch.access_token).to.not.be.undefined; 
      expect(dataSvc.LO.famSrch.username).to.equal("test"); 
      expect(dataSvc.LO.famSrch.password).to.equal(btoa("test")); 
      expect(dataSvc.LO.famSrch.access_token_expires).to.be.greaterThan(3600000); 

      expect(stubs.updateRecord.callCount).to.equal(1); 
      expect(stubs.updateRecord.args[0][1]).to.equal("localOption"); 
      expect(cb.callCount).to.equal(1); 
     }) 
    }); 
+1

Возможно, вы случайно включили 'angular-mocks.js' на свою страницу? Если это так, вы получите издевательскую версию '$ httpBackend'. Кроме того, тесты e2e в Angular обычно выполняются через транспортир, и вы управляете объектом 'browser'. То, что у вас в вашем вопросе, выглядит как единичный тест. – Phil

+0

Это технически единичный тест, но это то, что я хочу. Я не хочу запускать транспортир и выполнять сервис, вызывая элемент DOM веб-страницы. Я просто хочу проверить сервис. Угловые макеты, настроенные в карме, я должен был подумать об этом. Может быть, я попробую альтернативную конфигурацию кармы – ed4becky

+0

ugh, затем я потеряю инъекцию ... – ed4becky

ответ

0

Я не вижу никакой проблемы с включением E2E. Почему эта проблема для вас?

Если вы решите попробовать ngMockE2E, пожалуйста, помните, что он не обрабатывает ответы на асинхронные запросы.

Например, если ваш макет ответа является обещанием, это не сработает. Такие экземпляры, как переход в БД или использование чего-то вроде WebSQL/IndexedDB (или другого в БД памяти), не будут работать.

Я разработал угловой плагин под названием angular-mocks-async, чтобы его обработать. Вот пример макета:

var app = ng.module('mockApp', [ 
    'ngMockE2E', 
    'ngMockE2EAsync' 
]); 

app.run([ '$httpBackend', '$q', function($httpBackend, $q) { 

    $httpBackend.whenAsync(
     'GET', 
     new RegExp('http://api.example.com/user/.+$') 
    ).respond(function(method, url, data, config) { 

     var re = /.*\/user\/(\w+)/; 
     var userId = parseInt(url.replace(re, '$1'), 10); 

     var response = $q.defer(); 

     setTimeout(function() { 

      var data = { 
       userId: userId 
      }; 
      response.resolve([ 200, "mock response", data ]); 

     }, 1000); 

     return response.promise; 

    }); 

}]);