Jasmine测试对象属性

sfl*_*che 30 javascript jasmine

我想做什么

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

但是当然会Object.keys返回一个数组,根据定义它是有序的...我更喜欢这个测试通过而不管属性排序(这对我来说很有意义,因为无论如何都没有对象键排序的规范......(至少直至ES5)).

如何验证我的对象具有它应该具有的所有属性,同时还要确保它没有丢失任何属性,而不必担心以正确的顺序列出这些属性?

Pla*_*ato 44

现在已经内置了!

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
    }));
  });
});
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用外部检查,如_.has(包装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();
    })
  });
});
Run Code Online (Sandbox Code Playgroud)

  • 对 `jasmine.objectContaining` 部分竖起大拇指 (2认同)

Jor*_*ing 12

最简单的解决方案?分类.

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

expect(actual).toEqual(expected);
Run Code Online (Sandbox Code Playgroud)


小智 7

it('should contain object keys', () => {
  expect(Object.keys(myObject)).toContain('property1');
  expect(Object.keys(myObject)).toContain('property2');
  expect(Object.keys(myObject)).toContain('...');
});
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到StackOverflow!仅代码答案不被认为是高质量的。请详细说明您的代码的作用以及如何帮助解决该问题。 (5认同)