Làm cách nào để tập trung vào một thông số trong jasmine.js?


154

Tôi có một loạt các thông số kỹ thuật thất bại từ một thay đổi kiến ​​trúc khá lớn. Tôi muốn sửa từng cái một bằng cách gắn thẻ cho từng cái với 'tiêu điểm'.

Jasmine.js có một tính năng như thế này không? Tôi thề tôi đã đọc ở một điểm rằng nó làm nhưng tôi không thấy nó trong các tài liệu.


1
Câu trả lời gần đây của @ phil-pirozhkov chỉ ra rằng điều này đã được giới thiệu với Jaswine trong
phiên bản 2.1

Câu trả lời:


56

Bạn có thể chạy một thông số kỹ thuật bằng cách sử dụng url cho thông số kỹ thuật

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

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

}) 

Bây giờ bạn có thể chạy chỉ toàn bộ thông số theo url này http://localhost:8888?spec=MySpecvà thử nghiệm đầu tiên vớihttp://localhost:8888?spec=MySpec+function+1


10
Hoặc chỉ cần nhấp vào thông số kỹ thuật hoặc các thử nghiệm riêng lẻ trên trang kết quả
jackocnr

Tuyệt vời. Bây giờ, làm thế nào để tôi có được nó để chạy cái này: describe("MySpec", ...)và không phải cái này : describe("MySpec blah blah", ...)? Nó dường như đang làm một trận đấu chuỗi con.
Ian Phillips

description.only là câu trả lời đúng nếu sử dụng hoa nhài 2.0, không chắc chắn về các phiên bản khác.
davidjnelson

http://localhost:8888?spec=function+1cũng nên hoạt động (thường không cần chỉ định MySpec)
lee penkman

123
fdescribe,fit
basarat 19/03/2015

269

Khi sử dụng Karma, bạn chỉ có thể kích hoạt một thử nghiệm với fithoặc fdescribe( iitddescribetrong Jasmine trước 2.1).


Điều này chỉ chạy Spec1:

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

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

Điều này chỉ chạy testA:

describe('Spec1', function () {

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

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

});

7
Đây là một mẹo hay, nhưng hiện tại nó không phải là hoa nhài. điều này được cho phép bởi những người chạy thử như nghiệp. để biết thêm thông tin hãy đọc trên: github.com/pivotal/jasmine/pull/309
p1100i

77
Jasmine 2.1 giới thiệu điều này như fdescribefit: github.com/jasmine/jasmine/commit/iêu
alxndr

10
Bạn phải cẩn thận không cam kết thông số kỹ thuật ii hoặc dd. Dễ bỏ lỡ một cái gì đó như thế.
Rimian

@jameshfisher câu hỏi đã được hỏi vào năm 2011. Ngoài ra, iitddescribelà bổ sung của Karma, không phải Jasmine.
Justus Romijn

Tôi có phải là người duy nhất nghĩ rằng trộn lẫn vào xitvà khó đọc và dễ bị lỗi không? fitit
B Bảy

119

Trong lõi kể từ 2.1 với fitfdescribe.


1
Khi tôi sử dụng 'phù hợp' và chạy các bài kiểm tra của mình trong bảng điều khiển bằng karma, tôi có thể thấy rất nhiều bài kiểm tra bị bỏ qua, nhưng để xem các lỗi kiểm tra tôi cần phải cuộn lên trên cùng. Khi tôi chạy thử nghiệm mà không có 'phù hợp', tôi không gặp vấn đề như vậy, vì tôi có lỗi tóm tắt ở phía dưới. Bạn có biết làm thế nào để khắc phục vấn đề này?
tytyryty

25

Đối với bất kỳ ai vấp phải điều này, một cách tiếp cận tốt hơn, mà bạn có thể thiết lập từ chính mã, là sử dụng plugin này: https://github.com/davemo/jasmine-only

Nó cho phép bạn đặt độc quyền spec ngay trên mã như thế này:

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

Đã có một cuộc thảo luận dài để bổ sung điều này vào lõi Jasmine, xem: https://github.com/pivotal/jasmine/pull/309

Nếu bạn tình cờ sử dụng Jasmine qua Karma / Testacular, bạn đã có quyền truy cập ddescribe()iit()


12
+1 cho ddescribe và iit ... Đây phải là câu trả lời được chấp nhận.
Seth Hoa

Điều này là tốt nhất ... Cũng lưu ý rằng cú pháp mới là fdescribefit"f" có nghĩa là "tập trung". Xem thêm jasmine.github.io/2.1/f ​​Focused_specs.html
Ezekiel Victor

25

Có một vài cách bạn có thể làm điều đó.

Có: Tính năng của Jasmine Thông số kỹ thuật tập trung (2.2): http://jasmine.github.io/2.2/f Focused_specs.html

Thông số kỹ thuật tập trung sẽ làm cho nó để chúng là thông số kỹ thuật duy nhất chạy. Bất kỳ thông số kỹ thuật được tuyên bố với sự phù hợp được tập trung.

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

Tuy nhiên, tôi không thực sự thích ý tưởng chỉnh sửa các bài kiểm tra của mình (phù hợp và phù hợp) để chạy chúng một cách có chọn lọc. Tôi thích sử dụng một người chạy thử nghiệm như karma có thể lọc ra các bài kiểm tra bằng cách sử dụng một biểu thức thông thường.

Đây là một ví dụ sử dụng grunt .

$ grunt karma:dev watch --grep=mypattern

Nếu bạn đang sử dụng gulp (vốn là người chạy nhiệm vụ yêu thích của tôi), bạn có thể chuyển args thành gulp-karma với yargs và các mẫu khớp bằng cách đặt cấu hình của karma.

Kiểu như thế này:

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

Xem ý chính của tôi: https://gist.github.com/rimian/0f9b88266a0f63696f21

Vì vậy, bây giờ, tôi có thể chạy một thông số kỹ thuật bằng cách sử dụng mô tả:

Chạy thử cục bộ của tôi: (Đã thực hiện 1 trong 14 (bỏ qua 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

Xem thêm: https://github.com/karma-runner/karma-jasmine


Tôi thích ý tưởng của bạn về việc sử dụng grunt để chạy thử nghiệm có chọn lọc, nhưng tôi muốn gulp và karma config linh hoạt hơn, dễ mở rộng hơn và dễ hiểu hơn cho vấn đề đó.
nocarrier

8

Bạn có thể tạo tất cả thông số kỹ thuật của mình lên phía trước nhưng vô hiệu hóa chúng xdescribexitcho đến khi bạn sẵn sàng kiểm tra chúng.

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

Với Jasmine độc ​​lập (2.0.0), trên spec_runner.htm, tôi có thể nhấp vào một thông số cụ thể và tập trung vào một thông số đó. Tôi nên nhận thấy tính năng này sớm hơn.


1

Không chính xác những gì bạn đã yêu cầu nhưng việc thêm iitsẽ chỉ kiểm tra thông số cụ thể đó và bỏ qua tất cả những thứ khác trong tệp, ddescribehoạt động theo cùng một cách. Vì vậy, bạn có thể tập trung vào một thông số cụ thể bằng cách sử dụng iithoặcddescribe


1

Đây là câu trả lời đơn giản nhất với một ví dụ thực tế. Ngay cả trong fdescribe bạn có thể chạy vài khối nó bằng cách sử dụng nó. f có nghĩa là trọng tâm.

Ngoài ra, trong một khối không có mô tả chỉ là mô tả, bạn chỉ có thể chọn khối cụ thể bằng cách đánh dấu chúng là phù hợp.

Vui lòng chạy mã dưới đây và quan sát nhật ký giao diện điều khiển, cũng đọc các bình luận trong mã. Đọc bài viết của tác giả này nó cũng giúp. 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");
        }); 
      });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.