2015-07-20 19 views
12

Những gì tôi muốn làmJasmine kiểm tra đối với tài sản đối tượng

describe('my object', function() { 
    it('has these properties', function() { 
    expect(Object.keys(myObject)).toEqual([ 
     'property1', 
     'property2', 
     ... 
    ]); 
    }); 
}); 

nhưng tất nhiên Object.keys trả về một mảng, mà theo định nghĩa là ra lệnh ... Tôi muốn làm xét nghiệm này vượt qua bất kể tài sản đặt hàng (mà có ý nghĩa với tôi vì không có spec cho đặt hàng khóa đối tượng anyway ... (ít nhất là lên đến ES5)).

Làm cách nào tôi có thể xác minh đối tượng của mình có tất cả thuộc tính cần thiết, đồng thời đảm bảo rằng nó không thiếu bất kỳ thuộc tính nào mà không phải lo lắng về việc liệt kê các thuộc tính đó theo đúng thứ tự?

Trả lời

22

Bạn có thể sử dụng _.has (mà kết thúc tốt đẹp myObject.hasOwnProperty(prop)):

var _ = require('underscore'); 
describe('my object', function() { 
    it('has these properties', function() { 
    var props = [ 
     'property1', 
     'property2', 
     ... 
    ]; 
    props.forEach(function(prop){ 
     expect(_.has(myObject, prop)).toBeTruthy(); 
    }) 
    }); 
}); 

chỉnh sửa Tôi quên built in now của nó!

describe("jasmine.objectContaining", function() { 
    var foo; 

    beforeEach(function() { 
    foo = { 
     a: 1, 
     b: 2, 
     bar: "baz" 
    }; 
    }); 

    it("matches objects with the expect key/value pairs", function() { 
    expect(foo).toEqual(jasmine.objectContaining({ 
     bar: "baz" 
    })); 
    expect(foo).not.toEqual(jasmine.objectContaining({ 
     c: 37 
    })); 
    }); 
}); 
+1

nhưng bằng cách thứ hai các giá trị không thể bỏ qua, phải không ?! –

+1

điểm tốt, OP cần phương pháp tiếp cận đầu tiên cho trường hợp sử dụng "khóa kiểm tra có mặt mà không có giá trị thử nghiệm" – Plato

+1

Thumbs up to the 'jasmine.objectContaining' part –

7

Giải pháp đơn giản nhất? Sắp xếp.

var actual = Object.keys(myObject).sort(); 
var expected = [ 
    'property1', 
    'property2', 
    ... 
].sort(); 

expect(actual).toEqual(expected); 
2

Tôi đã kết thúc ở đây vì tôi đang tìm kiếm một cách để kiểm tra xem một đối tượng có một tập con đặc biệt không. Tôi bắt đầu với _.has hoặc Object.hasOwnProperties nhưng đầu ra của Expected false to be truthy khi nó không thành công không hữu ích.

Sử dụng giao gạch đã quyết định cho tôi một dự kiến ​​tốt hơn/thực tế sản lượng

var actualProps = Object.keys(myObj); // ["foo", "baz"] 
    var expectedProps =["foo","bar"]; 
    expect(_.intersection(actualProps, expectedProps)).toEqual(expectedProps); 

Trong trường hợp này là một thất bại có thể trông giống như Expected [ 'foo' ] to equal [ 'foo', 'bar' ]

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