对象属性的Jasmine测试

时间:2015-07-20 23:53:37

标签: javascript jasmine

我想做什么

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

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

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

7 个答案:

答案 0 :(得分:35)

它是built in now

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
    }));
  });
});

或者,您可以使用_.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();
    })
  });
});

答案 1 :(得分:11)

最简单的解决方案?排序

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

expect(actual).toEqual(expected);

答案 2 :(得分:3)

我最终在这里,因为我正在寻找一种方法来检查一个对象是否有一个特定的属性子集。 我从_.hasObject.hasOwnProperties开始,但失败时Expected false to be truthy的输出不是很有用。

使用下划线的交集给了我更好的预期/实际输出

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

在哪种情况下,失败可能看起来更像 Expected [ 'foo' ] to equal [ 'foo', 'bar' ]

答案 3 :(得分:1)

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

答案 4 :(得分:0)

以下是一些新的可能解决方案:

答案 5 :(得分:0)

这个主题我来晚了,但是有一种方法可以让您检查对象是否具有属性或键/值对:

expect(myObject).toHaveProperty(key);
expect({"a": 1, "b":2}).toHaveProperty("a");

expect(myObject).toHaveProperty(key,value);
expect({"a": 1, "b":2}).toHaveProperty("a", "1");

答案 6 :(得分:0)

我更喜欢使用它;因为您有更多的可能性进行单独的测试。

import AuthRoutes from '@/router/auth/Auth.ts';

describe('AuthRoutes', () => {
    it('Verify that AuthRoutes be an object', () => {
        expect(AuthRoutes instanceof Object).toBe(true);
    });

    it("Verify that authroutes in key 'comecios' contains expected key", () => {
        expect(Object.keys(AuthRoutes.comercios)).toContain("path");
        expect(Object.keys(AuthRoutes.comercios)).toContain("component");
        expect(Object.keys(AuthRoutes.comercios)).toContain("children");
        expect(AuthRoutes.comercios.children instanceof Array).toBe(true);

        // Convert the children Array to Object for verify if this contains the spected key
        let childrenCommerce = Object.assign({}, AuthRoutes.comercios.children);
        expect(Object.keys(childrenCommerce[0])).toContain("path");
        expect(Object.keys(childrenCommerce[0])).toContain("name");
        expect(Object.keys(childrenCommerce[0])).toContain("component");
        expect(Object.keys(childrenCommerce[0])).toContain("meta");

        expect(childrenCommerce[0].meta instanceof Object).toBe(true);
        expect(Object.keys(childrenCommerce[0].meta)).toContain("Auth");
        expect(Object.keys(childrenCommerce[0].meta)).toContain("title");

    })
});