2012-11-23 35 views
25

tôi cần phải thiết lập các thử nghiệm để thành công nếu một trong hai mong đợi được đáp ứng:Jasmine mong đợi logic (mong đợi A HOẶC B)

expect(mySpy.mostRecentCall.args[0]).toEqual(jasmine.any(Number)); 
expect(mySpy.mostRecentCall.args[0]).toEqual(false); 

tôi mong đợi nó trông như thế này:

expect(mySpy.mostRecentCall.args[0]).toEqual(jasmine.any(Number)).or.toEqual(false); 

Có bất kỳ điều gì tôi bị mất trong tài liệu hoặc tôi có phải viết trình kết hợp của riêng mình không?

+0

Tôi đã kiểm tra tài liệu và tôi đã thử một số mã, nhưng tôi nghĩ chúng tôi không thể làm điều đó "dễ dàng". Tuy nhiên, theo những gì tôi đã tìm thấy, bạn có thể tạo ra sự kết hợp "có thể thay đổi" của riêng mình. – Magus

Trả lời

10

Lưu ý: Giải pháp này chứa cú pháp cho các phiên bản trước Jasmine v2.0. Để biết thêm thông tin về quẹt tùy chỉnh bây giờ, xem: https://jasmine.github.io/2.0/custom_matcher.html


Matchers.js làm việc với một 'modifier kết quả' duy nhất mà thôi - not:

lõi/Spec.js:

jasmine.Spec.prototype.expect = function(actual) { 
    var positive = new (this.getMatchersClass_())(this.env, actual, this); 
    positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); 
    return positive; 

core/Matchers.js:

jasmine.Matchers = function(env, actual, spec, opt_isNot) { 
    ... 
    this.isNot = opt_isNot || false; 
} 
... 
jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { 
    return function() { 
    ... 
    if (this.isNot) { 
     result = !result; 
    } 
    } 
} 

Vì vậy, có vẻ như bạn thực sự cần viết trình kết nối của riêng bạn (từ trong một số before hoặc it khối cho đúng this). Ví dụ:

this.addMatchers({ 
    toBeAnyOf: function(expecteds) { 
     var result = false; 
     for (var i = 0, l = expecteds.length; i < l; i++) { 
     if (this.actual === expecteds[i]) { 
      result = true; 
      break; 
     } 
     } 
     return result; 
    } 
}); 
+1

Tất cả những gì tôi cần là 'không có nhiều trận đấu', câu trả lời này còn hơn thế nữa! :) Cảm ơn bạn đã viết mã. Tôi không nghĩ rằng nó xử lý trường hợp 'jasmine.any (Number)', nhưng tôi có thể giải quyết nó. Tôi sẽ đưa nó vào câu trả lời của bạn một khi đã tìm ra nếu bạn không nhớ. – naugtur

10

Đây là câu hỏi cũ, nhưng trong trường hợp bất kỳ ai vẫn đang tìm kiếm tôi có câu trả lời khác.

Làm thế nào về việc xây dựng biểu thức OR hợp lý và chỉ mong đợi điều đó? Như thế này:

var argIsANumber = !isNaN(mySpy.mostRecentCall.args[0]); 
var argIsBooleanFalse = (mySpy.mostRecentCall.args[0] === false); 

expect(argIsANumber || argIsBooleanFalse).toBe(true); 

Bằng cách này, bạn có thể kiểm tra rõ ràng/mong đợi điều kiện OR và bạn chỉ cần sử dụng Jasmine để kiểm tra sự khớp/không khớp Boolean. Sẽ hoạt động trong Jasmine 1 hoặc Jasmine 2 :)

18

Thêm nhiều chuỗi có thể so sánh vào một mảng và sau đó so sánh. Đảo ngược thứ tự so sánh.

expect(["New", "In Progress"]).toContain(Status); 
+0

Ý tưởng tuyệt vời, rất ngắn gọn! Và cung cấp các thông báo lỗi rõ ràng hơn nhiều so với 'expect (Status ==" New "|| Status ==" In Progress "). ToBe (true);' –

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