Как мне сосредоточиться на одной спецификации в 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 является правильным ответом, если используется jasmine 2.0, но не уверен насчет других версий.
Дэвиджнельсон

http://localhost:8888?spec=function+1должен работать тоже (часто не нужно указывать MySpec)
Ли Пенкман

123
fdescribe,fit
Басарат

269

При использовании Karma вы можете включить только один тест с помощью fitили fdescribe( iitи ddescribeв Jasmine до 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' и запускаю свои тесты в консоли, используя karma, я вижу много пропущенных тестов, но чтобы увидеть тестовые ошибки, мне нужно прокрутить вверх. Когда я запускаю тесты без «соответствия», у меня нет такой проблемы, так как у меня есть сводка ошибок внизу. Вы знаете, как решить эту проблему?
Тырытыть

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 для описания и ии ... Это должен быть принятый ответ.
Сет Флауэрс

Это лучше ... Также обратите внимание, что новый синтаксис fdescribeи fit- "f" означает "сфокусированный". См. Также jasmine.github.io/2.1/focused_specs.html
Иезекииль Виктор

25

Есть несколько способов сделать это.

Есть: функция Жасмина Сосредоточенные спецификации (2.2): http://jasmine.github.io/2.2/focused_specs.html

Фокусировка спецификаций сделает так, чтобы они были единственными работающими спецификациями. Любая спецификация, заявленная с помощью fit, сфокусирована.

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

Тем не менее, мне не очень нравится идея редактировать свои тесты (подходить и описывать), чтобы запускать их выборочно. Я предпочитаю использовать бегун тестов, такой как карма, который может отфильтровывать тесты, используя регулярные выражения.

Вот пример использования grunt .

$ grunt karma:dev watch --grep=mypattern

Если вы используете gulp (который является моим любимым средством выполнения задач), вы можете передавать args в gulp -karma с помощью yargs и шаблонов соответствия, установив конфигурацию karma.

Вроде как это:

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


Мне нравится ваша идея использовать grunt для выборочного запуска тестов, но мне бы хотелось, чтобы конфигурация gulp и karma была более гибкой, простой в расширении и более легкой для понимания.
нокарьер

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

С помощью автономного Jasmine (2.0.0) в spec_runner.htlm я мог щелкнуть конкретную спецификацию и сосредоточиться на этой спецификации. Я должен был заметить эту функцию ранее.


1

Не совсем то, что вы просили, но добавление iitбудет проверять только эту конкретную спецификацию и игнорировать все остальные в файле, ddescribeработает так же. Таким образом, вы можете сосредоточиться на конкретной спецификации, используя iitилиddescribe


1

Это самый упрощенный ответ с практическим примером. Даже в fdescribe вы можете использовать несколько блоков, используя его. F означает фокус.

Также в блоке без описания, который только что описан, вы можете выбрать только определенные блоки, пометив их как подходящие.

Пожалуйста, запустите приведенный ниже код и посмотрите журнал консоли, а также прочитайте комментарии в коде. Прочитайте эту авторскую статью, это тоже помогает. 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.