53 votes

Comment tester le fournisseur personnalisé AngularJS

Quelqu'un at-il un exemple de la façon de tester un fournisseur par unité?

Par exemple:

config.js

 angular.module('app.config', [])
  .provider('config', function () {
    var config = {
          mode: 'distributed',
          api:  'path/to/api'
        };

    this.mode = function (type) {
      if (type) {
        config.isDistributedInstance = type === config.mode;
        config.isLocalInstance = !config.isDistributedInstance;
        config.mode = type;
        return this;
      } else {
        return config.mode;
      }
    };

    this.$get = function () {
      retutn config;
    };
  }]);
 

app.js

 angular.module('app', ['app.config'])
  .config(['configProvider', function (configProvider) {
    configProvider.mode('local');
  }]);
 

app.js utilise dans les tests et je vois déjà configuré configProvider et je peux le tester en tant que service. Mais comment puis-je tester la possibilité de configurer? Ou il n'a pas besoin du tout?

64voto

Mark Gemmill Points 2851

J'ai eu cette même question et seulement trouvé une solution de travail dans ce Groupe Google de réponse et il est référencé violon exemple.

Les tests de votre fournisseur de code devrait ressembler à quelque chose comme ceci (à la suite du code dans le violon exemple et ce qui a fonctionné pour moi):

describe('Test app.config provider', function () {

    var theConfigProvider;

    beforeEach(function () {
        // Initialize the service provider 
        // by injecting it to a fake module's config block
        var fakeModule = angular.module('test.app.config', function () {});
        fakeModule.config( function (configProvider) {
            theConfigProvider = configProvider;
        });
        // Initialize test.app injector
        module('app.config', 'test.app.config');

        // Kickstart the injectors previously registered 
        // with calls to angular.mock.module
        inject(function () {});
    });

    describe('with custom configuration', function () {
        it('tests the providers internal function', function () {
            // check sanity
            expect(theConfigProvider).not.toBeUndefined();
            // configure the provider
            theConfigProvider.mode('local');
            // test an instance of the provider for 
            // the custom configuration changes
            expect(theConfigProvider.$get().mode).toBe('local');
        });
    });

});

46voto

james Points 279

j'ai été en utilisant @Mark Gemmill solution et cela fonctionne très bien, mais suis tombé sur celle-ci un peu moins verbeux solution qui élimine la nécessité pour un faux module.

http://stackoverflow.com/a/15828369/1798234

Donc,

var provider;

beforeEach(module('app.config', function(theConfigProvider) {
    provider = theConfigProvider;
}))

it('tests the providers internal function', inject(function() {
    provider.mode('local')
    expect(provider.$get().mode).toBe('local');
}));


Si vos fournisseurs de $méthode get a des dépendances, vous pouvez les passer manuellement,

var provider;

beforeEach(module('app.config', function(theConfigProvider) {
    provider = theConfigProvider;
}))

it('tests the providers internal function', inject(function(dependency1, dependency2) {
    provider.mode('local')
    expect(provider.$get(dependency1, dependency2).mode).toBe('local');
}));


Ou utiliser le $injecteur pour créer une nouvelle instance,

var provider;

beforeEach(module('app.config', function(theConfigProvider) {
    provider = theConfigProvider;
}))

it('tests the providers internal function', inject(function($injector) {
    provider.mode('local')
    var service = $injector.invoke(provider);
    expect(service.mode).toBe('local');
}));


Les deux ci-dessus vous permettent également de reconfigurer le fournisseur, pour chaque individu, it déclaration en describe bloc. Mais si vous avez uniquement besoin de configurer le fournisseur une fois pour les tests multiples, vous pouvez le faire,

var service;

beforeEach(module('app.config', function(theConfigProvider) {
    var provider = theConfigProvider;
    provider.mode('local');
}))

beforeEach(inject(function(theConfig){
    service = theConfig;
}));

it('tests the providers internal function', function() {
    expect(service.mode).toBe('local');
});

it('tests something else on service', function() {
    ...
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X