2015-02-26 18 views
11

Một trong các thử nghiệm của tôi dự kiến ​​văn bản thông báo lỗi là một trong nhiều giá trị. Vì getText() trả về lời hứa Tôi không thể sử dụng toContain() trình ghép hoa nhài. Sau đây sẽ không hoạt động kể từ protractor (jasminewd dưới-the-hood) sẽ không giải quyết được một lời hứa trong phần thứ hai của khớp, toContain() trong trường hợp này:Mục mong đợi trong mảng

expect(["Unknown Error", "Connection Error"]).toContain(page.errorMessage.getText()); 

Câu hỏi: Có cách nào để kiểm tra nếu một phần tử nằm trong một mảng với hoa nhài + thước đo góc trong đó một phần tử là một lời hứa?

Nói cách khác, tôi đang tìm nghịch đảo của toContain() để các expect() sẽ ngầm giải quyết lời hứa trôi qua trong


Là một workaround, tôi rõ ràng có thể giải quyết lời hứa với then():.

page.errorMessage.getText().then(function (text) { 
    expect(["Unknown Error", "Connection Error"]).toContain(text); 
}); 

Tôi không chắc đây có phải là lựa chọn tốt nhất hay không. Tôi cũng sẽ ổn với giải pháp dựa trên các bên thứ ba như jasmine-matchers.


Như một ví dụ, loại khẳng định tồn tại trong Python:

self.assertIn(1, [1, 2, 3, 4]) 
+0

Sử dụng 'chai-as-promise' –

+0

@BenjaminGruenbaum nếu bạn có thể xây dựng đề xuất thành câu trả lời bằng ví dụ - sẽ tuyệt vời, vì nó có vẻ giống như một lựa chọn thay thế hợp pháp phù hợp với một đối sánh tùy chỉnh. Cảm ơn bạn! – alecxe

+0

Nói chung tôi không thích cung cấp thư viện như câu trả lời cho câu hỏi vì điều đó làm cho các câu hỏi của thư viện-đề xuất - mà nói rằng tôi nghĩ rằng trên thực tế nó có lẽ là lựa chọn tốt nhất trong trường hợp này. –

Trả lời

12

Hình như bạn cần một khớp tùy chỉnh. Tùy thuộc vào phiên bản của Jasmine bạn đang sử dụng:

Với Jasmine 1:

this.addMatchers({ 
    toBeIn: function(expected) { 
     var possibilities = Array.isArray(expected) ? expected : [expected]; 
     return possibilities.indexOf(this.actual) > -1; 
    } 
}); 


Với Jasmine 2:

this.addMatchers({ 
    toBeIn: function(util, customEqualityTesters) { 
     return { 
      compare: function(actual, expected) { 
       var possibilities = Array.isArray(expected) ? expected : [expected]; 
       var passed = possibilities.indexOf(actual) > -1; 

       return { 
        pass: passed, 
        message: 'Expected [' + possibilities.join(', ') + ']' + (passed ? ' not' : '') + ' to contain ' + actual 
       }; 
      } 
     }; 
    } 
}); 


Bạn sẽ phải thực hiện điều này trong phần beforeEach trên mỗi số describe khối của bạn sẽ được sử dụng.

bạn mong đợi sẽ trông như thế:

expect(page.errorMessage.getText()).toBeIn(["Unknown Error", "Connection Error"]); 
5

Các giải pháp thay thế là sử dụng .toMatch() khớp với Regular Expressions và đặc biệt là một nhân vật đặc biệt | (gọi tắt là "hoặc"), cho phép để phù hợp chỉ có một mục nhập vào thành công:

expect(page.errorMessage.getText()).toMatch(/Unknown Error|Connection Error/); 
3

với tôi, công việc xung quanh mà bạn đã xác định i s giải pháp tốt nhất. Tuy nhiên, chúng tôi không nên quên rằng đây là thực thi không đồng bộ và bạn có thể muốn xem xét Jasmine's asynchronous support.

Sau đó, kiểm tra của bạn sẽ trông giống như một sau:

it('should check item is in array', function(done){ //Note the argument for callback 

    // do your stuff/prerequisites for the spec here 

    page.errorMessage.getText().then(function (text) { 
     expect(["Unknown Error", "Connection Error"]).toContain(text); 
     done(); // Spec is done! 
    }); 
}); 

Lưu ý: Nếu bạn không vượt qua done lập luận này cho spec callback, nó sẽ chạy đến khi kết thúc mà không thất bại, nhưng không có khẳng định sẽ được báo cáo trong kết quả thực hiện cho spec đó (nói cách khác, spec đó sẽ có xác nhận 0) và nó có thể dẫn đến nhầm lẫn.

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