Como me concentro em uma especificação no jasmine.js?


154

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

O jasmine.js possui um recurso como este? Jurei que li em um ponto que sim, mas não o vejo nos documentos.


1
@ pontos resposta recentes de phil-Pirozhkov que este foi introduzido para Jaswine em v2.1
alxndr

Respostas:


56

Você pode executar uma única especificação usando o URL da 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=MySpece fazer o primeiro teste comhttp://localhost:8888?spec=MySpec+function+1


10
Ou basta clicar sobre especificações ou testes individuais na página de resultados
jackocnr

Impressionante. Agora, como faço para executar este: describe("MySpec", ...)e não este describe("MySpec blah blah", ...):? Parece estar fazendo uma correspondência de substring.
Ian Phillips

descrevem.only é a resposta correta se estiver usando o jasmim 2.0, não tenho certeza sobre outras versões.
Davidjnelson

http://localhost:8888?spec=function+1deve funcionar também (muitas vezes não é necessário especificar MySpec)
penkman lee

123
fdescribe,fit
basarat 19/03/2015

269

Ao usar o Karma, você pode ativar apenas um teste com fitou fdescribe( iite ddescribeno Jasmine antes da 2.1).


Isso é executado apenas 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 é executado apenas testA:

describe('Spec1', function () {

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

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

});

7
é uma boa dica, mas atualmente não está em jasmim. isso é permitido por corredores de testes como o karma. para obter mais informações, leia: github.com/pivotal/jasmine/pull/309
p1100i

77
O Jasmine 2.1 apresenta isso como fdescribee fit: github.com/jasmine/jasmine/commit/…
alxndr

10
Você teria que ter cuidado para não confirmar especificações ii ou dd. É fácil perder algo assim.
Rimian

@jameshfisher, a pergunta foi feita em 2011. Além disso, iite ddescribesão adições ao Karma, não ao Jasmine.
Justus Romijn 25/03

Eu sou o único que pensa que misturar xite fitentrar ité difícil de ler e propenso a erros?
B

119

No núcleo desde 2.1 com fite fdescribe.


1
Quando uso 'fit' e executo meus testes no console usando karma, vejo muitos testes ignorados, mas para ver os erros de teste, preciso rolar para o topo. Quando executo testes sem 'ajuste', não tenho esse problema, pois tenho um resumo de erros na parte inferior. Você sabe como corrigir esse problema?
tytyryty

25

Para quem se deparar com isso, 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 das especificações diretamente no código como este:

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 adicionar isso ao núcleo do Jasmine, consulte: https://github.com/pivotal/jasmine/pull/309

Se você estiver usando Jasmine via Karma / Testacular, já deverá ter acesso ddescribe()eiit()


12
+1 para ddescribe e iit ... Essa deve ser a resposta aceita.
Seth Flores

Isso é melhor ... Observe também que a nova sintaxe é fdescribee fit- "f" significa "focado". Veja também jasmine.github.io/2.1/focused_specs.html
Ezekiel Victor

25

Existem algumas maneiras de fazer isso.

Há: recurso Jasmine's Focused Specs (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 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 realmente não gosto da ideia de editar meus testes (fit e fdescribe) para executá-los seletivamente. Prefiro usar um corredor de teste como o karma, que pode filtrar os testes usando uma expressão regular.

Aqui está um exemplo usando o grunhido .

$ grunt karma:dev watch --grep=mypattern

Se você estiver usando gulp (que é o meu executor de tarefas favorito), poderá passar argumentos para o gulp-karma executor de com yargs e padrões de correspondência 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 minha essência: https://gist.github.com/rimian/0f9b88266a0f63696f21

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

Minha execução de 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

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


Gosto da sua ideia de usar o grunhido para executar seletivamente testes, mas gostaria que a configuração do gulp e do karma fosse mais flexível, mais fácil de estender e mais fácil de entender para esse assunto.
Nocarrier 13/0618

8

Você pode criar todas as suas especificações antecipadamente, mas desativá-las com xdescribee xitaté estar 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 () {
  });
});

1

Com o Jasmine independente (2.0.0), no spec_runner.htlm, eu poderia clicar em uma especificação específica e focar nela. Eu deveria ter notado esse recurso anteriormente.


1

Não é exatamente o que você pediu, mas a adição iittestará apenas essa especificação específica e ignorará todas as outras no arquivo, ddescribefunciona da mesma maneira. Para que você possa se concentrar em uma especificação específica usando iitouddescribe


1

Esta é a resposta mais simplificada com um exemplo prático. Mesmo no fdescribe, você pode executar alguns blocos usando-o. f significa foco.

Também em um bloco sem descrição, que é apenas descrição, é possível selecionar apenas blocos específicos, marcando-os como adequados.

Por favor, execute o código abaixo e observe o log do console, leia também os comentários no código. Leia o artigo deste autor também ajuda. https://davidtang.io/2016/01/03/controlling-which-tests-run-in-jasmine.html

 //If you want to run few describe only add f so using focus those describe blocks and it's it block get run

  fdescribe("focus description i get run with all my it blocks ", function() {
    it("1 it in fdescribe get executed", function() {
        console.log("1 it in fdescribe get executed unless no fit within describe");

    });
    it("2 it in fdescribe get executed", function() {
        console.log("2 it in fdescribe get executed unless no fit within describe");

    });
    //but if you and fit in fdescribe block only the fit blocks get executed
    fit("3  only fit blocks in  fdescribe get executed", function() {
        console.log("If there is  a fit   in fdescribe only fit blocks  get executed");

    });
  });

  describe("none description i get skipped with all my it blocks ", function() {
        it("1 it in none describe get skipped", function() {
            console.log("1 it in none describe get skipped");

        });
        it("2 it in none describe get skipped", function() {
            console.log("2 it in none describe get skipped");
        });
//What happen if we had fit in a none fdescribe block will it get run ?   yes  
       fit("3 fit in none describe get executed too eventhough it;s just describe ", function() {
            console.log("3 fit in none describe get executed too");
        }); 
      });
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.