2017-06-09 5 views
1

Es gibt ein seltsames Verhalten in einem Argument in einem globalen Javascript-Objekt: Ich muss meinen Code mit jasmine.js testen, aber ich kann nicht den erwarteten Wert an das Argument übergeben gib immer undefiniert im Jasmintest zurück.Seltsames Verhalten in JavaScript-Argument in einem globalen Objekt

//My model 
myGlobalObject = function(){ 
    _myCart = function(){ 
     return { 
     total : 0, 
     products : [] 
     } 
    } 

    return { 
     init: function(strangeArgument){ 
     console.log(strangeArgument) //this return undefined in jasmine test 
     }, 

    myCart : _myCart, 

    addProduct : function(Products){ 
     return _myCart() 
    }, 

    ..... 
    } 

} 

Der Test:

const c{ 
    empty : { 
     total: { 
     beforeVAT: 0, 
     afterVAT: 0, 
     VAT: 0 
     }, 
    products: [] 
    } 
} 

beforeEach(() => { 
    this.instance = myGlobalObject(); 
    this.instance.init(); 
    this.productWithoutQuantity = Object.assign({}, _.productA); 
    delete this.productWithoutQuantity.quantity; 
    this.productWithQuantity = Object.assign({}, _.productB); 
    }); 

test(`the cart should be empty`,() => { 
    expect(this.instance.getCart()).toEqual(c.empty); 
    }); 

.... more tests 

Und mein Haupt js:

var e = myGlobalObject(); 
var initialState = function(){ 
    return { 
     total: { 
     beforeVAT: 0, 
     afterVAT: 0, 
     VAT: 0 
     }, 
    products: [] 
    } 
} 
e.init(initialState); 

Was seine falsch?

+0

natürlich ist es nicht definiert, wenn Sie anrufen 'this.instance.init(); 'ohne Argumente? – Bergi

+0

Uh, benutze keine globalen Objekte ... Insbesondere lecke '_myCart' nicht. – Bergi

+0

Hi Bergi, tks for answer, aber warum, wenn ich den Code innerhalb von main.js nehme und das Argument' strangeArgument' in meine module.js Datei lege funktioniert richtig? – Mauro

Antwort

0

Obwohl ich nicht ganz die Absicht des OP zu verstehen, hier finden Sie mein nehmen auf die Frage

  • _myCart kann eine lokale Variable sein, weil es keine größeren Zweck zu dienen scheint, atleast aus dem Code von OP

  • Der Aufruf an instance.init kann mit leeren Klammern oder mit einer legitimen Variable sein - hängt davon ab, was OP versucht, hier zu erreichen.

  • ich beide main.js Code-Schnipsel enthalten haben sowie testVariable.instance.init(); (auf einem einfachen beachten Sie seine nicht definiert, wenn es trotzdem so kommentiert von @Bergi nicht definiert ist)

  • Sehen sie in Aktion here

myGlobalObject = function() { 
 
    this._myCart = function() { 
 
    return { 
 
     total: 0, 
 
     products: [] 
 
    } 
 
    } 
 

 
    return { 
 
    init: function(strangeArgument) { 
 
     console.log(strangeArgument) 
 
    }, 
 
    myCart: this._myCart, 
 
    addProduct: function(Products) { 
 
     return this._myCart() 
 
    } 
 
    } 
 

 
} 
 

 
var e = myGlobalObject(); 
 
var initialState = function() { 
 
    return { 
 
    total: { 
 
     beforeVAT: 0, 
 
     afterVAT: 0, 
 
     VAT: 0 
 
    }, 
 
    products: [] 
 
    } 
 
} 
 
e.init(initialState); 
 

 
describe('ajax test suite', function() { 
 
    var testVariable = {} 
 
    var c = { 
 
    empty: { 
 
     total: 0, 
 
     products: [] 
 
    } 
 
    } 
 

 
    beforeEach(function() { 
 
    testVariable.instance = myGlobalObject(); 
 
    testVariable.instance.init("hello"); 
 
    testVariable.instance.init(); 
 
    }); 
 

 
    it('the cart should be empty', function() { 
 
    expect(testVariable.instance.myCart()).toEqual(c.empty); 
 
    }); 
 
});