Чи існує збірник жасмину для порівняння об’єктів за підмножинами їх властивостей


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.objectConinting, який не обробляє масив, як описано в іншій відповіді, врешті-решт я просто використав array.map для очікуваного результату, щоб отримати об'єкт, що відповідає наприклад, залишивши це тут для розгляду як альтернативу.
Brandon Søren Culley

Відповіді:


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)замість ваших об'єктів безпосередньо?
Kamil Szot

11

У мене була та сама проблема. Я щойно спробував цей код, він працює для мене:

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

3
Це не зовсім стосується питання, оскільки воно поверне істину, якщо значення не збігаються.
KellowColor

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

Я думав, що запропоную альтернативу, використовуючи сучасний оператор map and rest javascript. Ми можемо опустити властивості, використовуючи деструктуризацію з оператором відпочинку. Див. Подальший опис у цій статті .

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.