2012-01-20 14 views
8

Tôi có một khớp tùy chỉnh trong một số thông số kỹ thuật kiểm tra Jasmine có dạng:Có cách nào để sử dụng các trình so khớp mặc định của Jasmine trong các trình so khớp tùy chỉnh không?

this.addMatchers({ 
    checkContains: function(elem){ 
     var found = false; 
     $.each(this.actual, function(actualItem){ 

      // Check if these objects contain the same properties. 
      found = found || actualItem.thing == elem; 
     }); 
     return found; 
    } 
}); 

Tất nhiên, actualItem.thing == elem không thực sự so sánh đối tượng contents- tôi phải sử dụng một trong những giải pháp phức tạp hơn trong Object comparison in JavaScript.

Tôi không thể không thông báo, tuy nhiên, Jasmine đã có một trình kiểm tra đối tượng tốt đẹp: expect(x).toEqual(y). Có cách nào để sử dụng điều đó trong một trình phù hợp tùy chỉnh không? Có cách nào chung để sử dụng các đối sánh trong các đối sánh tùy chỉnh không?

Trả lời

5

Có, hơi khó hiểu nhưng hoàn toàn có thể.

Điều đầu tiên chúng ta cần làm là làm cho lớp Jasmine.Env khả dụng. Cá nhân tôi đã làm điều này trong SpecRunner.html của tôi kể từ khi nó đã được thiết lập ở đó anyway. Trên tải của SpecRunner của tôi, tôi có kịch bản sau đó chạy:

(function() { 
     var jasmineEnv = jasmine.getEnv(); 
     jasmineEnv.updateInterval = 1000; 

     var trivialReporter = new jasmine.TrivialReporter(); 

     jasmineEnv.addReporter(trivialReporter); 

     jasmineEnv.specFilter = function(spec) { 
     return trivialReporter.specFilter(spec); 
     }; 

     var currentWindowOnload = window.onload; 

     window.onload = function() { 
     if (currentWindowOnload) { 
      currentWindowOnload(); 
     } 
     execJasmine(); 
     }; 

     function execJasmine() { 
     jasmineEnv.execute(); 
     }; 

    })(); 

Vì vậy, sau khi execJasmine khai chức năng tôi đẩy jasmineEnv vào không gian tên toàn cầu bằng cách thêm này:

this.jasmineEnv = jasmineEnv; 

Bây giờ, trong bất kỳ tệp spec nào của tôi, tôi có thể truy cập biến jasmineEnv và đó là những gì chứa mã lõi của đối sánh.

Nhìn vào toEqual cụ thể, toEqual gọi hàm jasmine.Env.prototype.equals_. Điều này có nghĩa rằng trong customMatcher của bạn, bạn có thể làm như sau:

beforeEach(function(){ 
    this.addMatchers({ 
     isJasmineAwesome : function(expected){ 
      return jasmineEnv.equals_(this.actual, expected); 
     } 
    }); 
}); 

Thật không may, sử dụng phương pháp này sẽ chỉ cung cấp cho bạn truy cập vào các phương pháp sau:

  1. compareObjects_
  2. equals_
  3. contains_

Phần còn lại của đối sánh nằm trong lớp jasmine.Matchers nhưng tôi chưa b een có thể làm cho công chúng được nêu ra. Tôi hy vọng điều này sẽ giúp bạn trong một cách khác nhau hoặc khác

+0

Thật tuyệt vời, cảm ơn! Điều này cũng có thể là một trường hợp mà các giải pháp tôi đang tìm kiếm (một trong những bạn đã cho) là tồi tệ hơn so với vấn đề tôi đã cố gắng để tránh (kiểm tra đối tượng bình đẳng của riêng tôi). Rất mát mẻ, tuy nhiên, mặc dù. – Fishtoaster

+0

Nếu bạn muốn sử dụng đối sánh tùy chỉnh A trong một trình phù hợp tùy chỉnh B khác, bạn có thể thêm logic cho đối sánh A của mình vào mẫu hoa nhài.Env.prototype và sau đó gọi nhật ký đó từ bên trong trình ghép B bằng cách sử dụng jasmine.getEnv () .myMatcherFn(). –

Các vấn đề liên quan