2017-01-02 4 views
1

Ich habe eine einzige Aktion in einem Ember-Controller definiert, die 2 separate Funktionen, die Teil des Controllers sind aufgerufen. Ich möchte diese Funktionen in einem Komponententest ausspionieren, um zu bestätigen, ob die Aktionsmethode die richtige Funktion aufgerufen hat.Wie Unit-Test ein Glut-Controller

Mein Controller sieht wie folgt aus:

export default Ember.Controller.extend({ 
    functionA() { 
     return; 
    }, 
    functionB() { 
     return; 
    }, 
    actions: { 
     actionMethod(param) { 
      if(param) { 
       return this.functionA(); 
      } 
      else { 
       return this.functionB(); 
      } 
     } 
    } 
}); 

In der Praxis arbeitet der Regler jedoch in der Unit-Test, praktischen und FunktionD sind beide nicht definiert. Ich habe versucht, this auf der Konsole zu loggen, aber nicht finden, wo FunktionA und FunktionB sind, so dass ich nicht in der Lage, sie richtig zu verspotten. Ich erwartete, dass sie sich in der obersten Ebene des Objekts neben Aktionen befinden, aber ich fand nur mit actionMethod richtig definiert.

My Unit-Test sieht aus wie unten

const functionA = function() { return; } 
const functionB = function() { return; } 
test('it can do something', function(assert) { 
    let controller = this.subject(); 
    // I don't want the real functions to run 
    controller.set('functionA', functionA); 
    controller.set('functionB', functionB); 
    controller.send('actionMethod', ''); 
    // raises TypeError: this.functionA is not a function 

    // this doesn't work etiher 
    // controller.functionB = functionB; 
    // controller.functionA = functionA; 
    // controller.actions.actionMethod(); 
} 

Hat jemand irgendwelche Ideen, wie ich diese Funktionen in der Testumgebung ersetzen kann? Oder gibt es vielleicht eine bessere Möglichkeit, diese Funktionalität zu testen oder meinen Controller einzurichten?

  • bearbeiten Tippfehler: this.subject()
+0

Side Hinweis: 1. Um Controller-Objekt zu erstellen, müssen Sie 'this_subject()' aufrufen. 2. 'controller.send' Methode wird keinen Wert an den Aufrufer zurückgeben. – kumkanillam

+0

Whoops typo - Ich habe 'thissubject()' aufgerufen. Wie für 'controller.send', versuchte ich diese Methode wie oben gezeigt sowie' controller.actions.actionMethod() ' – user2989731

Antwort

1

Um die Funktionen des Controllers in dem Einheit Test zu ersetzen, können Sie Parameter an die Funktion übergeben this.subject():

let controller = this.subject({ 
    functionA(){ 
     //this function overriddes functionA 
    }, 
    functionB(){ 
     //this function overriddes functionB 
    }, 
}); 

bei the sample twiddle Blick.

Diese Methode ist besonders nützlich zum Ersetzen der injizierten service der Controller.

0

Einführung Eigenschaft this.subject entsprechenden Sie tun haben, lassen Sie uns name Eigenschaft sagen, So würde Ihre Controller wie folgt aussehen werden,

Und Sie können für den Eigenschaftswert name nach dem Aufruf actionMethod testen.

test(" testing functionA has been called or not", function(assert){ 
    let controller = this.subject(); 
    controller.send('actionMethod',true); 
    //If you would like to call functionA just say controller.functionA() 
    assert.strictEqual(controller.get('name'),'A',' name property has A if actionMethod arguments true'); 
    controller.send('actionMethod',false); 
    assert.strictEqual(controller.get('name'),'B',' name property has B actionMethod arguments false'); 
}); 
+0

aufrufen Ich bin nur versucht, Ihre Frage zu beantworten, um mich selbst zu lernen, um ehrlich zu sein, habe ich nicht geschrieben Alle Tests in meinem Projekt – kumkanillam

+0

Wenn Sie Eigenschaften beim Erstellen eines Objekts dynamisch definieren möchten, müssen Sie es als Argument an die 'subject'-Methode übergeben, wie wir es tun, wenn wir ein Objekt mit 'create()' erstellen. 'this_subject ({functionA: function() {this.set ('name', 'AA'); return;}});' – kumkanillam