क्या उनके गुणों के सबसेट पर वस्तुओं की तुलना करने के लिए चमेली मिलान है


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.object का उपयोग नहीं कर सका, जो कि किसी अन्य उत्तर में वर्णित सरणी को हैंडल नहीं करता है, अंत में मैंने ऑब्जेक्ट के मिलान के लिए अपेक्षित परिणाम प्राप्त करने के लिए अपेक्षित परिणाम पर array.map का उपयोग किया। उदाहरण के लिए, एक विकल्प के रूप में विचार के लिए यहां छोड़ना।
ब्रैंडन सॉरेन कुली

जवाबों:


145

चमेली २.०

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
@ शिव - शायद आप Object.keys(obj)अपनी वस्तुओं के बजाय सीधे परिणामों की तुलना करने की कोशिश कर सकते हैं?
कामिल स्ज़ोट

11

मुझे भी यही समस्या हुई है। मैंने इस कोड की कोशिश की, यह मेरे लिए काम करता है:

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

3
यदि यह मान मेल नहीं खाता है, तो यह प्रश्न को काफी संबोधित करता है, क्योंकि यह सच हो जाएगा।
ज्ञातव्य

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.