속성의 하위 집합에서 개체를 비교하는 재스민 매 처가 있습니까?


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.objectContaining을 직접 사용할 수 없었습니다. 결국 예상 결과에 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})
    }));
});

다른 값과 유사한 키를 포함하는 객체에 대해 동일한 작업을 수행하는 방법이 있습니까?
Siva

3
@Siva- Object.keys(obj)개체 대신 결과를 직접 비교해 볼 수 있습니까?
Kamil Szot

11

나는 같은 문제가 있었다. 나는 방금이 코드를 시도했지만 나를 위해 작동합니다.

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

3
값이 일치하지 않으면 true를 반환하므로 질문을 제대로 처리하지 못합니다.
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

나는 현대 자바 스크립트 맵과 휴식 연산자를 사용하여 대안을 제공 할 것이라고 생각했습니다. 나머지 연산자와 함께 비 구조화를 사용하여 속성을 생략 할 수 있습니다. 이 기사의 추가 설명을 참조하십시오 .

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

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

expect(rest).toEqual(example)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.