WedX - журнал о программировании и компьютерных науках

Жасминовый тест на свойства объекта

Что я хотел бы сделать

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

но, конечно, Object.keys возвращает массив, который по определению упорядочен... Я бы предпочел, чтобы этот тест проходил независимо от порядка свойств (что имеет смысл для меня, поскольку в любом случае нет спецификации для порядка ключа объекта... (в минимум до ES5)).

Как я могу проверить, что мой объект имеет все свойства, которые он должен иметь, а также убедиться, что он не упускает никаких свойств, не беспокоясь о перечислении этих свойств в правильном порядке?

20.07.2015

Ответы:


1

Он встроен!

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();
    })
  });
});
21.07.2015
  • но во-вторых, значения нельзя игнорировать, верно?! 04.04.2017
  • хороший момент, OP нуждается в первом подходе для варианта использования тестовых ключей без тестовых значений 06.04.2017
  • Большой палец вверх до части jasmine.objectContaining 30.01.2018

  • 2

    Самое простое решение? Сортировать.

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

    3

    Я оказался здесь, потому что искал способ проверить, что объект имеет определенное подмножество свойств. Я начал с _.has или Object.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' ]

    02.03.2017

    4

    Вот несколько новых возможных решений:

    03.11.2016

    5

    Я предпочитаю использовать это; потому что у вас больше возможностей для выполнения индивидуального теста.

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

    6

    Я опоздал к этой теме, но есть метод, который позволяет вам проверить, есть ли у объекта пара свойств или ключ/значение:

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

    or

    expect(myObject).toHaveProperty(key,value);
    expect({"a": 1, "b":2}).toHaveProperty("a", "1");
    
    16.04.2019
  • Я не вижу метод toHaveProperty(). Это для жасмина? 23.04.2019
  • Этот метод недоступен для Жасмин 11.05.2021

  • 7
  • Добро пожаловать в StackOverflow! Ответы, содержащие только код, не считаются качественными. Пожалуйста, уточните, что делает ваш код и как он помогает решить проблему. 25.10.2018
  • Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. 25.10.2018
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]