2014-06-17 15 views
8

Bu soru, diğer sorum (addMockModule ileticiden kullanmayı önerdikleri) için olası bir çözümdür: Call other api when running tests using Protractor.

Aşağıdaki dosyam var: mockedRest.js Bu, yansıtıcıya eklemek istediğim modüldür. Herhangi bir REST çağrılarını kesmeli ve adresi değiştirmelidir (api/apiMock /).

exports.apiMockModule = function() { 

    console.log('apiMockModule executing'); 

    var serviceId = 'mockedApiInterceptor'; 
    angular.module('apiMockModule', ['myApp']) 
     .config(['$httpProvider', configApiMock]) 
     .factory(serviceId, 
     [mockedApiInterceptor]); 

    function mockedApiInterceptor() { 
     return { 
      request: function (config) { 
       console.log('apiMockModule intercepted'); 
       if ((config.url.indexOf('api')) > -1) { 
        config.url.replace('api/', 'apiMock/'); 
       } 

       return config; 
      }, 
      response: function (response) { 
       return response 
      } 
     }; 
    } 

    function configApiMock($httpProvider) { 
     $httpProvider.interceptors.push('mockedApiInterceptor'); 
    } 
}; 

Daha sonra, modülü yüklediğim gerçek sınamam var.

describe('E2E addMockModule', function() { 
    beforeEach(function() { 
     var mockModule = require('./mockedRest'); 
     browser.addMockModule('apiMockModule', mockModule.apiMockModule); 
     console.log('apiMockModule loaded'); 
     browser.get('#page'); 
    }); 
    it('tests the new apiMock', function() { 
     // test that clicks a button that performs a rest api call. left out as I can see the call in fiddler. 
    }); 
}); 

Ancak DİNLENME çağrı hala 'API /' yerine 'apiMock /' Ben onun işi yapmak için önleme almak için daha fazla şey yapmak zorunda olmadığını bilmiyorum işaret ediyor. Ayrıca, apiMockModule içinde modülün yüklenmemesi gibi konsolda oturum açmış bir şey olmadığını da not etmeye değer.

Herhangi bir tavsiye

takdir edilmektedir.

cevap

11

Ben bunu yapmak için mock modülünde iki küçük hata düzeltmeleri yapıyorum.

  • sahte modül uygulamanıza bağlı gerekmez,
  • config.url dönüştürülmüş biri tarafından ayarlanması gerekir.

mockedRest.js güncelleme:

exports.apiMockModule = function() { 

    console.log('apiMockModule executing'); 

    var serviceId = 'mockedApiInterceptor'; 
    angular.module('apiMockModule', []) 
     .config(['$httpProvider', configApiMock]) 
     .factory(serviceId, 
     [mockedApiInterceptor]); 

    function mockedApiInterceptor() { 
     return { 
      request: function (config) { 
       console.log('apiMockModule intercepted'); 
       if ((config.url.indexOf('api')) > -1) { 
       config.url = config.url.replace('api/', 'apiMock/'); 
       } 

       return config; 
      }, 
      response: function (response) { 
       return response 
      } 
     }; 
    } 

    function configApiMock($httpProvider) { 
     $httpProvider.interceptors.push('mockedApiInterceptor'); 
    } 
}; 

ben bu ortamda bu kodu test ettik:

  • iletki 0.24.1
  • açısal 1.2.16
  • ChromeDriver 2.10.267517
  • Google chrome 35.0.1 916,153
  • Mac OS X 10.9.3 x86_64

Sen yazdı: yok

şey apiMockModule

normaldir iç konsola açmış, modül kodu iletici tarafından yürütülmez, ancak tarayıcıya (driver.executeScript kullanarak) gönderilir. Böylece kod tarayıcı tarafından yürütülür.

Ama hata ayıklama için get the logs from the browser mümkündür: açıklama ve onarımları için

... 
it('tests the new apiMock', function() { 
    browser.manage().logs().get('browser').then(function(browserLog) { 
    console.log('log: ' + require('util').inspect(browserLog)); 
    }); 
... 
+0

sayesinde ama hala çalışmıyor. Bunu hata ayıklamanın başka bir yolu var mı? Config.url = 'bir şey' ayarlasam bile bu değeri kullanmıyor – emp

+0

Şaşırdım çünkü bu kodu test ettim. – gontard

+0

Cevabımı tamamladım. – gontard