it-swarm-pt.tech

Como faço para me concentrar em uma especificação no jasmine.js?

Eu tenho um monte de especificações de falha de uma grande mudança arquitetônica. Eu gostaria de trabalhar em corrigi-los um por um, marcando cada um com "foco".

O jasmine.js tem um recurso como este? Eu jurei que li em um ponto que isso acontece, mas não vejo isso nos documentos.

141
Dane O'Connor

Você pode executar uma única especificação usando o URL para a especificação

describe("MySpec", function() { 
  it('function 1', function() { 
    //... 
  }) 

  it('function 2', function() { 
    //... 
  } 

}) 

Agora você pode executar apenas toda a especificação por este url http://localhost:8888?spec=MySpec e um primeiro teste com http://localhost:8888?spec=MySpec+function+1

53
Andreas Köberle

Ao usar o Karma, você pode habilitar apenas um teste com fit ou fdescribe (iit e ddescribe no Jasmine antes de 2.1).


Isso só executa Spec1:

// or "ddescribe" in Jasmine prior 2.1
fdescribe('Spec1', function () {
    it('should do something', function () {
        // ...
    });
});

describe('Spec2', function () {
    it('should do something', function () {
        // ...
    });
});

Isso só executa testA:

describe('Spec1', function () {

    // or "iit" in Jasmine prior 2.1
    fit('testA', function () {
        // ...
    });

    it('testB', function () {
        // ...
    });

});
242
Hudvoy

no núcleo desde 2.1 com fit e fdescribe.

117
phil pirozhkov

Existem algumas maneiras de fazer isso.

Há: O recurso de Jasmine Especs. Focadas (2.2): http://jasmine.github.io/2.2/focused_specs.html =

As especificações de foco farão com que sejam as únicas especificações que são executadas. Qualquer especificação declarada com ajuste é focada.

describe("Focused specs", function() {
  fit("is focused and will run", function() {
    expect(true).toBeTruthy();
  });

  it('is not focused and will not run', function(){
    expect(true).toBeFalsy();
  });
});

No entanto, eu não gosto muito da idéia de editar meus testes (fit e fdescribe) para executá-los seletivamente. Eu prefiro usar um test runner como karma que pode filtrar os testes usando uma expressão regular.

Aqui está um exemplo usando grunhido .

$ grunt karma:dev watch --grep=mypattern

Se você estiver usando gulp (que é o meu favorito tarefa runner), você pode passar args em gulp-karma com yargs e combinar padrões, definindo a configuração do karma.

Mais ou menos assim:

var Args = function(yargs) {
  var _match = yargs.m || yargs.match;
  var _file = yargs.f || yargs.file;
  return {
    match: function() { if (_match) { return {args: ['--grep', _match]} } }
  };
}(args.argv);


var Tasks = function() {
  var test = function() {
    return gulp.src(Files.testFiles)
      .pipe(karma({ configFile: 'karma.conf.js', client: Args.match()}))
      .on('error', function(err) { throw err; });
  };

  return {
    test: function() { return test() }
  }
}(Args);

gulp.task('default', ['build'], Tasks.test);

Veja meu Gist: https://Gist.github.com/rimian/0f9b88266a0f63696f21

Então, agora, posso executar uma única especificação usando a descrição:

Meu teste local: (executado 1 de 14 (ignorado 13))

gulp -m 'triggers the event when the API returns success'
[20:59:14] Using gulpfile ~/gulpfile.js
[20:59:14] Starting 'clean'...
[20:59:14] Finished 'clean' after 2.25 ms
[20:59:14] Starting 'build'...
[20:59:14] Finished 'build' after 17 ms
[20:59:14] Starting 'default'...
[20:59:14] Starting Karma server...
INFO [karma]: Karma v0.12.31 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
WARN [watcher]: All files matched by "/spec/karma.conf.js" were excluded.
INFO [Chrome 42.0.2311 (Mac OS X 10.10.3)]: Connected on socket hivjQFvQbPdNT5Hje2x2 with id 44705181
Chrome 42.0.2311 (Mac OS X 10.10.3): Executed 1 of 14 (skipped 13) SUCCESS (0.012 secs / 0.009 secs)
[20:59:16] Finished 'default' after 2.08 s

Veja também: https://github.com/karma-runner/karma-jasmine

24
Rimian

Para alguém que tropeça nisso, uma abordagem melhor, que você pode configurar a partir do próprio código, é usar este plugin: https://github.com/davemo/jasmine-only

Ele permite que você defina a exclusividade da especificação diretamente no código da seguinte forma:

describe.only("MySpec", function() { 
  it('function 1', function() { 
    //... 
  }) 

  it.only('function 2', function() { 
    //... 
  }
})
// This won't be run if there are specs using describe.only/ddescribe or it.only/iit
describe("Spec 2", function(){}) 

Houve uma longa discussão para obter isso adicionado ao núcleo Jasmine, veja: https://github.com/pivotal/jasmine/pull/309

Se você estiver usando Jasmine via Karma/Testacular, você já deve ter acesso a ddescribe() e iit()

24
albemuth

Você pode criar todas as suas especificações na frente, mas desativá-las com xdescribe e xit até que você esteja pronto para testá-las.

describe('BuckRogers', function () {
  it('shoots aliens', function () {
    // this will be tested
  });

  xit('rescues women', function () {
    // this won't
  });
});

// this whole function will be ignored
xdescribe('Alien', function () {
  it('dies when shot', function () {
  });
});
8
Eric Bock

Não é exatamente o que você pediu, mas a inclusão de iit testará apenas essa especificação específica e ignorará todos os outros no arquivo, ddescribe funcionará da mesma maneira. Então você pode se concentrar em uma determinada especificação usando iit ou ddescribe

1
Filype

Com o autônomo Jasmine (2.0.0), no spec_runner.htlm, eu poderia clicar em uma especificação específica e focar naquela especificação. Eu deveria ter notado esse recurso antes.

1
taro