Есть ли средство сопоставления жасмина для сравнения объектов по подмножествам их свойств


84

У меня есть объект, который может быть расширен в соответствии с моим тестируемым поведением, но я хочу убедиться, что исходные свойства все еще существуют.

var example = {'foo':'bar', 'bar':'baz'}

var result = extendingPipeline(example)
// {'foo':'bar', 'bar':'baz', 'extension': Function}

expect(result).toEqual(example) //fails miserably

Я хотел бы иметь сопоставитель, который проходил бы в этом случае по строкам:

expect(result).toInclude(example)

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


У меня была аналогичная проблема при попытке сравнить массивы, поэтому я не мог напрямую использовать jasmine.objectContain, который не обрабатывает массив, как описано в другом ответе, в конце концов я просто использовал array.map для ожидаемого результата, чтобы получить объект, соответствующий Например, оставив это здесь для рассмотрения в качестве альтернативы.
Брэндон Сорен Калли

Ответы:


145

Жасмин 2.0

expect(result).toEqual(jasmine.objectContaining(example))

Поскольку это исправление: https://github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0, оно работает даже с вложенными объектами, вам просто нужно обернуть каждый объект, который вы хотите частично сопоставить, вjasmine.objectContaining()

Простой пример:

it('can match nested partial objects', function ()
{
    var joc = jasmine.objectContaining;
    expect({ 
        a: {x: 1, y: 2}, 
        b: 'hi' 
    }).toEqual(joc({
        a: joc({ x: 1})
    }));
});

Есть ли способ сделать то же самое для объекта, содержащего разные значения и похожие ключи?
Шива

3
@Siva - Может быть, вы могли бы попробовать сравнить результаты Object.keys(obj)вместо ваших объектов напрямую?
Камил Сзот

11

У меня была такая же проблема. Я только что попробовал этот код, у меня он работает:

expect(Object.keys(myObject)).toContain('myKey');

3
Это не совсем решает вопрос, поскольку вернет истину, если значения не совпадают.
KnownColor

2

Я не думаю, что это настолько распространено, и я не думаю, что вы сможете найти его. Просто напишите один:

beforeEach(function () {
    this.addMatchers({
        toInclude: function (expected) {
            var failed;

            for (var i in expected) {
                if (expected.hasOwnProperty(i) && !this.actual.hasOwnProperty(i)) {
                    failed = [i, expected[i]];
                    break;
                }
            }

            if (undefined !== failed) {
                this.message = function() {
                    return 'Failed asserting that array includes element "'
                        + failed[0] + ' => ' + failed[1] + '"';
                };
                return false;
            }

            return true;
        }
    });
});

1

Я подумал, что предложу альтернативу с использованием современной карты javascript и оператора rest. Мы можем опускать свойства, используя деструктурирование с оператором rest. См. Дальнейшее описание в этой статье .

var example = {'foo':'bar', 'bar':'baz'}

var { extension, ...rest } = extendingPipeline(example)

expect(rest).toEqual(example)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.