Có một trình so sánh hoa nhài để so sánh các đối tượng trên các tập con thuộc tính của chúng không


84

Tôi có một đối tượng có thể được mở rộng theo hành vi của tôi đang được thử nghiệm, nhưng tôi muốn đảm bảo rằng các thuộc tính ban đầu vẫn ở đó.

var example = {'foo':'bar', 'bar':'baz'}

var result = extendingPipeline(example)
// {'foo':'bar', 'bar':'baz', 'extension': Function}

expect(result).toEqual(example) //fails miserably

Tôi muốn có một đối sánh sẽ vượt qua trong trường hợp này, dọc theo các dòng:

expect(result).toInclude(example)

Tôi biết rằng tôi có thể viết một trình đối sánh tùy chỉnh, nhưng có vẻ như đối với tôi đây là một vấn đề phổ biến đến mức cần phải có giải pháp. Tôi nên tìm nó ở đâu?


Tôi đã gặp sự cố tương tự khi cố gắng so sánh các mảng nên tôi không thể sử dụng trực tiếp jasmine.objectContainer không xử lý mảng như được mô tả trong một câu trả lời khác, cuối cùng tôi chỉ sử dụng array.map trên kết quả mong đợi để có được một đối tượng khớp với ví dụ, để lại điều này ở đây để xem xét như một sự thay thế.
Brandon Søren Culley

Câu trả lời:


145

Hoa nhài 2.0

expect(result).toEqual(jasmine.objectContaining(example))

Vì bản sửa lỗi này: https://github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0 nó thậm chí hoạt động trên các đối tượng lồng nhau, bạn chỉ cần bọc từng đối tượng bạn muốn khớp một phầnjasmine.objectContaining()

Ví dụ đơn giản:

it('can match nested partial objects', function ()
{
    var joc = jasmine.objectContaining;
    expect({ 
        a: {x: 1, y: 2}, 
        b: 'hi' 
    }).toEqual(joc({
        a: joc({ x: 1})
    }));
});

Có cách nào để làm điều tương tự cho một đối tượng chứa các giá trị khác nhau và các khóa tương tự không?
Siva

3
@Siva - Có thể bạn có thể thử so sánh kết quả Object.keys(obj)thay vì trực tiếp đối tượng của mình?
Kamil Szot

11

Tôi đã có cùng một vấn đề. Tôi vừa thử mã này, nó hoạt động với tôi:

expect(Object.keys(myObject)).toContain('myKey');

3
Điều này không giải quyết được câu hỏi vì nó sẽ trả về true nếu các giá trị không khớp.
Đã biết Màu sắc

2

Tôi không nghĩ rằng nó là phổ biến và tôi không nghĩ bạn có thể tìm thấy một cái. Chỉ cần viết một:

beforeEach(function () {
    this.addMatchers({
        toInclude: function (expected) {
            var failed;

            for (var i in expected) {
                if (expected.hasOwnProperty(i) && !this.actual.hasOwnProperty(i)) {
                    failed = [i, expected[i]];
                    break;
                }
            }

            if (undefined !== failed) {
                this.message = function() {
                    return 'Failed asserting that array includes element "'
                        + failed[0] + ' => ' + failed[1] + '"';
                };
                return false;
            }

            return true;
        }
    });
});

1

Tôi nghĩ rằng tôi sẽ đưa ra một giải pháp thay thế bằng cách sử dụng bản đồ javascript hiện đại và toán tử nghỉ ngơi. Chúng ta có thể bỏ qua các thuộc tính bằng cách sử dụng hàm hủy với toán tử rest. Xem thêm mô tả trong bài viết này .

var example = {'foo':'bar', 'bar':'baz'}

var { extension, ...rest } = extendingPipeline(example)

expect(rest).toEqual(example)
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.