Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象属性的茉莉花测试_Javascript_Jasmine - Fatal编程技术网

Javascript 对象属性的茉莉花测试

Javascript 对象属性的茉莉花测试,javascript,jasmine,Javascript,Jasmine,我想做什么 describe('my object', function() { it('has these properties', function() { expect(Object.keys(myObject)).toEqual([ 'property1', 'property2', ... ]); }); }); 但是当然,Object.keys返回一个数组,根据定义,数组是有序的……我更愿意让这个测试通过,而不管属性的顺序

我想做什么

describe('my object', function() {
  it('has these properties', function() {
    expect(Object.keys(myObject)).toEqual([
      'property1',
      'property2',
      ...
    ]);
  });
});
但是当然,
Object.keys
返回一个数组,根据定义,数组是有序的……我更愿意让这个测试通过,而不管属性的顺序如何(这对我来说是有意义的,因为无论如何都没有对象键顺序的规范……(至少在ES5之前)

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

太棒了

或者,您可以使用外部检查,如(包装
myObject.hasOwnProperty(prop)
):


最简单的解决方案?排序

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

expect(actual).toEqual(expected);

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

  • 这有一个模块:
  • 使用ES2016,您也可以使用地图并将对象转换为地图

我之所以来到这里,是因为我在寻找一种方法来检查对象是否具有特定的属性子集。 我从
\uhas
Object.hasOwnProperties
开始,但是
的输出在失败时预期false为truthy
不是很有用

使用下划线的交集可以获得更好的预期/实际输出

  var actualProps = Object.keys(myObj); // ["foo", "baz"]
  var expectedProps =["foo","bar"];
  expect(_.intersection(actualProps, expectedProps)).toEqual(expectedProps);
在这种情况下,故障看起来更像
预期['foo']等于['foo',bar']

本主题我迟到了,但有一种方法允许您检查对象是否具有属性或键/值对:

it('should contain object keys', () => {
  expect(Object.keys(myObject)).toContain('property1');
  expect(Object.keys(myObject)).toContain('property2');
  expect(Object.keys(myObject)).toContain('...');
});
expect(myObject).toHaveProperty(key);
expect({"a": 1, "b":2}).toHaveProperty("a");


我更喜欢用这个;因为,您有更多的可能执行独立测试

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

    })
});

但是第二种方法是不能忽略这些值,对吗?!很好的一点,OP需要第一种方法来处理“测试键存在而不测试值”的用例,向
jasmine竖起大拇指。objectContaining
partWelcome to StackOverflow!只有代码的答案不被认为是高质量的。请详细说明您的代码的作用以及它如何帮助解决问题。虽然此代码可以回答问题,但提供有关它如何和/或为什么解决问题的其他上下文将提高答案的长期价值。我没有看到
toHaveProperty()
方法。这是给茉莉花的吗?那个方法对茉莉花不适用
expect(myObject).toHaveProperty(key);
expect({"a": 1, "b":2}).toHaveProperty("a");
expect(myObject).toHaveProperty(key,value);
expect({"a": 1, "b":2}).toHaveProperty("a", "1");
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");

    })
});