Let'a eine einfache EmberJS Komponente annehmen:Mocking Komponente Funktion für die Zwecke der Komponentenintegrationstest in EmberJS
//my-app/components/my-component.js
export default Ember.Component.extend({
classNames: ['cursor-pointer'],
doSth(){
// whatever, state of the component does not change
},
clickListener: Ember.on('click', function(){
this.doSth();
})
});
Nun möchte Ich mag Integrationstests verwenden, um herauszufinden, ob Anklicken der Komponente erreicht (Delegierten finden) die doSth()
Methode.
moduleForComponent('my-component', 'Integration | Component | stores parser previewer', {
integration: true
});
test('should call doSth() on click', function (assert) {
/* Line 3 - the place I tried to set mocked doSth() up */
this.render(hbs`{{my-component}}`);
this.$('.cursor-pointer').click(); // triggers clickListener() correctly
});
Das Problem ist, dass ich nicht Methode doSth()
mit meiner mock ersetzen. So stoße ich nie auf assert.ok()
Aussage.
habe ich versucht, folgende Aussagen auf die Linie 3 im Test einzufügen:
// idea 1
this.set('doSth', function(){
assert.ok(true);
});
// idea 2
this.doSth = function(){
assert.ok(true);
};
Keine der 2 Ansätze (idea 1, Idee 2) gearbeitet. this.subject()
ist ebenfalls nicht verfügbar, da es sich um einen Integrationstest und nicht um einen Komponententest handelt.
Update: Stellen doSth()
sein, eine Funktion wie die openUrlInANewTab() unter dem entspricht nicht den Zustand der Komponente beeinflussen, noch die zugehörigen Controller noch Route des Staates. Beispiel:
//my-app/components/my-component.js
...
import openUrlInANewTab from 'my-app/utils/new-tab-opener';
...
export default Ember.Component.extend({
...
doSth(url){
openUrlInANewTab(url);
}
während
// my-app/utils/new-tab-opener.js
export default function openUrlInANewTab(){
anchor = document.createElement("a");
...
anchor.click();
...
}
würde etwas wie [dies] (https://github.com/elwayman02/ember-sinon-qunit) Hilfe? – MilkyWayJoe
Im Abschnitt [Usage] (https://github.com/elwayman02/ember-sinon-qnit#usage) wird im Beispiel von const route = thissubject(); gefolgt von const stub = this.stub ausgegangen (route, 'transitionTo'); '. Da ich 'this_subject()' nicht verwenden darf, bleibt das Problem bestehen. Ich habe versucht, es direkt wie folgt zu verwenden: 'const stub = this.Stub (dies, 'DoSth') '; aber ich bekomme folgenden Fehler: 'Kann keine nicht existierende eigene Eigenschaft doSth' – Pavol
stub wenn' component.doSth' etwas zum Controller oder zu Ihrer Route macht, können Sie testen, ob oder nicht * das Ding * passiert; Wenn Sie überprüfen möchten, ob der Klick die 'doSth'-Funktion erfolgreich ausführt, dann weiß ich nicht, ob dieser bestimmte Test in der Integration sein sollte – MilkyWayJoe