2016-12-06 3 views
1

При попытке проверить аргументы, переданные функции с помощью метода Jest .toHaveBeenCalledWith(), тест завершился неудачно, если я обрабатываю неизменяемые структуры данных с использованием библиотеки ImmutableJS. Тест завершается с сообщением похожее на это:Аргументы аргумента функции jest не совпадают при использовании неизменяемых структур данных

Expected mock function to have been called with: 
    [{"foo": true, "bar": "baz"}] 
But it was called with: 
    [{"foo": true, "bar": "baz"}] 

тест выглядит примерно так:

const expectedArgs = Map({ 
    foo: true, 
    bar: 'baz' 
}); 

const foo = jest.fn(); 
bar(); 
expect(foo).toHaveBeenCalledWith(expectedArgs); 

И функции, подобной этой:

const bar =() => { 
    const baz = Map({}); 
    const bazModified = baz.set('foo', true).set('bar', 'baz'); 
    foo(bazModified); 
} 

Я понял, что если я пропустите аргументы таким образом, все работает нормально:

const bar =() => { 
    const baz = Map({ 
    foo: true, 
    bar: 'baz' 
    }); 
    foo(baz); 
} 

Проблема в том, что это большое упрощение логики моей функции, и я должен использовать .set для построения объекта. У кого-нибудь есть идея, почему подход с .set не правильно оценивается?

ответ

2

Так что ваш тест не работает, потому что toHaveBeenCalledWith проходит только в том случае, если экземпляры объектов точно совпадают. Он похож на следующий, который также терпит неудачу:

const expectedArgs = Map({ 
    foo: true, 
    bar: 'baz' 
}); 

const input = Map({ 
    foo: false, 
    bar: 'baz' 
}); 

const result = input.set('foo', true); 

expect(result).toBe(expectedArgs); 

Это, с другой стороны, делает работу:

expect(result).toEqual(expectedArgs); 

Потому что выполняет глубокий равных.

Вы не сможете проверить равенство с помощью toHaveBeenCalledWith, так как baz.set('foo', true) всегда будет возвращать новый экземпляр (который является точкой использования неизменяемых данных).

Я не думаю, что есть способ сделать toHaveBeenCalledWith вести себя как toEqual, так что я предполагаю, что путь должен вручную проверить фиктивный вызов toEqual:

const expectedArgs = Map({ 
    foo: true, 
    bar: 'baz' 
}); 

const foo = jest.fn(); 
bar(); 
// foo.mock.calls[0][0] returns the first argument of the first call to foo 
expect(foo.mock.calls[0][0]).toEqual(expectedArgs); 

Посмотреть документацию на toBe, , и mock calls