Як зосередитись на одній специфікації в jasmine.js?


154

У мене є купа провальних специфікацій із досить великої архітектурної зміни. Я хотів би попрацювати над їх виправленням один за одним, позначивши кожну з них «фокусом».

Чи є у jasmine.js така функція? Я поклявся, що прочитав одного разу, що це так, але я не бачу цього в документах.


1
Нещодавня відповідь @ phil-pirozhkov вказує на те, що це було представлено Jaswine в v2.1
alxndr

Відповіді:


56

Ви можете запустити одну специфікацію, використовуючи URL для специфікації

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

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

}) 

Тепер ви можете запустити лише цілу специфікацію за цією URL-адресою http://localhost:8888?spec=MySpecта першим тестомhttp://localhost:8888?spec=MySpec+function+1


10
Або просто натисніть на специфікації або окремі тести на сторінці результатів
jackocnr

Дивовижно. Тепер, як змусити його запустити цей: describe("MySpec", ...)а не цей describe("MySpec blah blah", ...):? Здається, проводиться збіг підрядок.
Ян Філіпс

description.only - правильна відповідь, якщо ви використовуєте жасмін 2.0, не впевнені в інших версіях.
davidjnelson

http://localhost:8888?spec=function+1також повинні працювати (часто не потрібно вказувати MySpec)
lee penkman

123
fdescribe,fit
базарат

269

Під час використання Karma можна ввімкнути лише один тест за допомогою fit або fdescribe( iitі ddescribeв жасмин , перш ніж 2.1).


Це лише працює Spec1:

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

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

Це працює лише testA:

describe('Spec1', function () {

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

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

});

7
це хороша порада, але в даний час він не в жасмині. це дозволено тестовими бігунами на зразок карми. Більше інформації читайте на сайті: github.com/pivotal/jasmine/pull/309
p1100i

77
Жасмін 2.1 представляє це як fdescribeі fit: github.com/jasmine/jasmine/commit/…
alxndr

10
Вам доведеться бути обережними, щоб не скористатися специфікаціями ii або dd. Легко пропустити щось подібне.
Рім’ян

@jameshfisher запитання було задано в 2011 році. Також є iitі ddescribeдоповнення Карма, а не Жасмін.
Юстус Ромійн

Чи я єдиний, хто думає, що змішання xitта fitвтруднення itважко читати та схильні до помилок?
B Сім

119

В ядрі з 2.1 з fitі fdescribe.


1
Коли я використовую "fit" і запускаю свої тести в консолі за допомогою карми, я бачу багато пропущених тестів, але щоб побачити помилки тесту, мені потрібно прокрутити до початку. Коли я запускаю тести без "підходу", у мене немає такої проблеми, оскільки внизу є підсумки помилок. Чи знаєте ви, як виправити це питання?
титирити

25

Для тих, хто натрапляє на це, кращим підходом, який ви можете встановити з самого коду, є використання цього плагіна: https://github.com/davemo/jasmine-only

Це дозволяє встановити право ексклюзивності прямо на код таким чином:

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(){}) 

Продовжувалося обговорення, щоб додати це до ядра Жасмін, див. https://github.com/pivotal/jasmine/pull/309

Якщо ви випадково використовуєте Жасмін через Karma / Testacular, ви вже повинні мати доступ до нього ddescribe() таiit()


12
+1 для опису та iit ... Це має бути прийнята відповідь.
Seth Flowers

Це найкраще ... Також зауважте, що новий синтаксис є fdescribeі fit- "f", що означає "зосереджений". Дивіться також jasmine.github.io/2.1/focused_specs.html
Єзекіїль Віктор

25

Є кілька способів зробити це.

Є: Жасмін особливість фокусованих специфікацій (2.2): http://jasmine.github.io/2.2/focused_specs.html

Якщо фокусувати фокуси, це дозволить зробити їх єдиними. Будь-яка специфікація, оголошена придатною, орієнтована.

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();
  });
});

Однак мені не дуже подобається ідея редагування моїх тестів (fit і fdescribe), щоб запускати їх вибірково. Я вважаю за краще використовувати тестовий запуск на зразок карми, який може фільтрувати тести, використовуючи регулярний вираз.

Ось приклад використання грунту .

$ grunt karma:dev watch --grep=mypattern

Якщо ви використовуєте gulp (це мій улюблений виконавець завдань), ви можете передати аргументи в gulp-карму з yargs та шаблонами відповідності, встановивши конфігурацію карми.

Ніби так:

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);

Дивіться мою суть: https://gist.github.com/rimian/0f9b88266a0f63696f21

Тож тепер я можу запустити одну специфікацію, використовуючи опис:

Мій локальний тестовий запуск: (Виконано 1 з 14 (пропущено 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

Також дивіться: https://github.com/karma-runner/karma-jasmine


Мені подобається ваша ідея використання грунту для вибіркового запуску тестів, але я б хотів, щоб глот і конфігурація карми були більш гнучкими, легшими для розширення і простішими для розуміння.
nocarrier

8

Ви можете створити всі свої характеристики спереду, але вимкнути їх xdescribeі xitдо тих пір, поки не будете готові перевірити їх.

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

За допомогою автономної жасмину (2.0.0) на spec_runner.htlm я міг натиснути конкретну специфікацію та зосередитись на цій одній специфікації. Я повинен був помітити цю особливість раніше.


1

Не точно те, що ви просили, але додавання iitперевірятиме лише цю специфікацію та ігнорує всі інші файли, ddescribeпрацює так само. Таким чином, ви можете зосередитися на певній специфікації, використовуючи iitабоddescribe


1

Це найпростіша відповідь на практичному прикладі. Навіть у fdescribe ви можете запустити кілька блоків, використовуючи її. f означає фокус.

Також у блоці none fdescribe, який є лише описом, ви можете вибрати лише конкретні блоки, позначивши їх як придатні.

Будь ласка, запустіть наведений нижче код та дотримуйтесь журналу консолі, також прочитайте коментарі до цього коду. Прочитайте цю статтю автора, яка теж допомагає. 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");
        }); 
      });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.