2015-06-26 7 views
2

Я тестирую провайдера в Jasmine, который опирается на другого провайдера. Конфигурация, связанная с этим провайдером, отсутствует. Когда насмешливый поставщика, я прочитал, вы должны использовать что-то вродеМоментальный пользовательский поставщик, введенный в провайдер при модульном тестировании Угловой в Жасмине

beforeEach(module(function ($provide) { 
    mockInjectedProvider = { }; 
    $provide.value('injected', mockInjectedProvider); 
})); 

, который прекрасно работает для меня, когда инъекционные пользовательского поставщика в службу. При введении их в провайдер это не работает. Код не прерывается, но то, что выполняется, когда тестирование является фактическим провайдером, а не издевательством. Приведенный ниже пример.

var mockInjectedProvider; 

beforeEach(function() { 
    module('myModule'); 
}); 

beforeEach(module(function ($provide) { 
    mockInjectedProvider = { 
     myFunc: function() { 
      return "testvalue" 
      } 
     } 
    }; 
    $provide.value('injected', mockInjectedProvider); 
})); 

beforeEach(inject(function (_base_) { 
    baseProvider = _base_; 
})); 

it("injectedProvider should be mocked", function() { 
    var resultFromMockedProvider = baseProvider.executeMyFuncFromInjected(); 
    expect(resultFromMockedProvider).toEqual("testvalue"); 
}); // Here instead of using my mock it executes the actual dependency 

$provide.value В заявлении я попытался в том числе как injected и injectedProvider, а также с помощью $provide.provider и насмешливый на $get функцию на нем, но ничего не похоже на работу. Я просто не могу заставить его высмеять фактического провайдера. Тезисный базовый провайдер выглядит так.

(function (ng, module) { 
    module.provider("base", 
     ["injectedProvider", function (injectedProvider) { 
      this.executeMyFuncFromInjected= function() { 
       return injectedProvider.myFunc(); // let's say this returns "realvalue" 
      } 
      this.$get = function() { 
       return this; 
      }; 
     }] 
    ); 
})(window.angular, window.angular.module("myModule")); 

Все, что работает в моем коде, кроме насмешливого Жасмина.

+0

Я думаю, что вы должны использовать метод 'provider' вместо метода' value'. например, '$ provider.provider ('injected', mockInjectedProvider)'; – Raulucco

+0

Как я уже сказал, попробовал '$ offer.провайдер' уже. Конечный результат точно такой же. – Jan

+0

Да, извините. На самом деле я понимаю, что на самом деле вам не следует проверять функцию, которая делегирует функции внедренного поставщика, но проверять непосредственно функцию внедренного поставщика, потому что в примере у вас есть соответствующая логика. Или вместо того, чтобы издеваться над сервисом, чтобы добавить шпиона в функцию внедренного поставщика и проверить, была ли функция вызвана 'ожидать (injectedProvider.myFunc) .toHaveBeenCalled()' – Raulucco

ответ

2

В этом случае лучше просто высмеять возвращаемое значение вместо поставщика.

var mockInjectedProvider; 

beforeEach(function() { 
    module('myModule'); 
}); 

beforeEach(inject(function (_injected_) { 
    spyOn(_injected_, "myFunc").and.returnValue("testvalue"); 
})); 

beforeEach(inject(function (_base_) { 
    baseProvider = _base_; 
})); 

it("injectedProvider should be mocked", function() { 
    var resultFromMockedProvider = baseProvider.executeMyFuncFromInjected(); 
    expect(resultFromMockedProvider).toEqual("testvalue"); 
}); // Here instead of using my mock it executes the actual dependency 
+0

Спасибо за это. С этим боролся слишком долго! – Jan