ฉันจะมุ่งเน้นไปที่หนึ่ง spec ใน 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", ...)? ดูเหมือนว่าจะทำการจับคู่สตริงย่อย
Ian Phillips

description.only เป็นคำตอบที่ถูกต้องหากใช้ jasmine 2.0 ไม่แน่ใจเกี่ยวกับเวอร์ชันอื่น
davidjnelson

http://localhost:8888?spec=function+1ควรทำงานด้วย (มักไม่จำเป็นต้องระบุ MySpec)
lee penkman

123
fdescribe,fit
basarat

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 พลาดง่าย ๆ แบบนั้น
Rimian

@jameshfisher คำถามถูกถามในปี 2011 iitและddescribeเป็นส่วนเสริมของ Karma ไม่ใช่จัสมิน
Justus Romijn

ฉันเพียงคนเดียวที่คิดว่าการผสมxitและfitเข้าitยากที่จะอ่านและข้อผิดพลาดง่าย?
B เซเว่น

119

ในหลักตั้งแต่ 2.1 พร้อมและfitfdescribe


1
เมื่อฉันใช้ 'พอดี' และรันการทดสอบในคอนโซลโดยใช้กรรมฉันสามารถเห็นการทดสอบที่ข้ามได้ แต่เพื่อดูข้อผิดพลาดการทดสอบที่ฉันต้องเลื่อนไปด้านบน เมื่อฉันรันการทดสอบที่ไม่มี 'พอดี' ฉันไม่มีปัญหาดังกล่าวเนื่องจากฉันมีข้อผิดพลาดสรุปที่ด้านล่าง คุณรู้วิธีแก้ไขปัญหานี้หรือไม่?
tytyryty

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

หากคุณเคยใช้ดอกมะลิผ่านกรรม / พันธสัญญาคุณควรเข้าใช้ddescribe()แล้วiit()


12
+1 สำหรับ ddescribe และ iit ... นี่ควรเป็นคำตอบที่ยอมรับได้
เซทดอกไม้

นี้จะดีที่สุด ... นอกจากนี้ทราบว่าไวยากรณ์ใหม่เป็นfdescribeและfit- "ฉ" ความหมาย "ที่มุ่งเน้น" ดูเพิ่มเติมที่jasmine.github.io/2.1/focused_specs.html
Ezekiel Victor

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

อย่างไรก็ตามฉันไม่ชอบความคิดในการแก้ไขการทดสอบของฉัน (พอดีและ fdescribe) เพื่อเรียกใช้การคัดเลือก ฉันชอบใช้นักวิ่งทดสอบอย่างกรรมซึ่งสามารถกรองการทดสอบโดยใช้นิพจน์ทั่วไป

นี่คือตัวอย่างการใช้เสียงฮึดฮัด

$ grunt karma:dev watch --grep=mypattern

หากคุณกำลังใช้อึก (ซึ่งเป็นนักวิ่งงานโปรดของฉัน) คุณสามารถส่งข้อความไปยังอึก - กรรมและกรรมวิธีด้วยรูปแบบและรูปแบบการจับคู่โดยตั้งค่ากำหนดกรรม

ค่อนข้างชอบ:

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


ฉันชอบความคิดของคุณในการใช้เสียงฮึดฮัดเพื่อทำการทดสอบแบบเลือกสรร แต่ฉันหวังว่า gulp และ karma config จะมีความยืดหยุ่นมากขึ้นง่ายต่อการขยายและเข้าใจง่ายกว่าสำหรับเรื่องนั้น
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

ด้วย Jasmine แบบสแตนด์อะโลน (2.0.0) บน spec_runner.htlm ฉันสามารถคลิก spec ที่เจาะจงและมุ่งเน้นไปที่ spec หนึ่ง ฉันควรสังเกตคุณสมบัตินี้ก่อนหน้านี้


1

ไม่ว่าคุณจะขออะไร แต่การเพิ่มiitจะทดสอบเฉพาะข้อมูลจำเพาะนั้นและไม่สนใจผู้อื่นทั้งหมดในไฟล์ แต่ddescribeทำงานในลักษณะเดียวกัน ดังนั้นคุณสามารถมุ่งเน้นไปที่ข้อมูลจำเพาะที่ใช้iitหรือddescribe


1

นี่เป็นคำตอบที่ง่ายที่สุดพร้อมตัวอย่างที่เป็นประโยชน์แม้ใน fdescribe คุณสามารถเรียกใช้ได้เพียงไม่กี่บล็อกเท่านั้น f หมายถึงโฟกัส

นอกจากนี้ในบล็อก 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");
        }); 
      });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.