2

Ich bin immer noch sehr neu im Komponententest, und um ehrlich zu sein, gibt es nichts, was ich überhaupt testen könnte, aber ich kann nicht bauen Meine App, es sei denn, ich habe mindestens einen Testfall, also habe ich versucht, den einfachsten Testfall auf dem kleinsten Codeblock des Controllers zu erstellen, und es scheint nicht zu funktionieren.Karma + PhantomJS TypeError: undefined ist kein Objekt (evauling scope.jackpot)

Ich glaube, es ist ein Fehler in meinem Testfall, und nicht in meinem Controller-Code selbst, denn wenn ich meine App im Browser mit grunt serve anzeigen, zeigt die Konsole keine Fehler.

Dies ist der Fehler, den es gibt mir:

PhantomJS 2.1.1 (Linux 0.0.0) Controller: MainCtrl should attach a list of jackpot to the scope FAILED 
/home/elli0t/Documents/Yeoman Projects/monopoly/app/bower_components/angular/angular.js:3746:53 
[email protected][native code] 
[email protected]/home/elli0t/Documents/Yeoman Projects/monopoly/app/bower_components/angular/angular.js:323:18 
[email protected]/home/elli0t/Documents/Yeoman Projects/monopoly/app/bower_components/angular/angular.js:3711:12 
[email protected]/home/elli0t/Documents/Yeoman Projects/monopoly/app/bower_components/angular/angular.js:3651:22 
[email protected]/home/elli0t/Documents/Yeoman Projects/monopoly/app/bower_components/angular-mocks/angular-mocks.js:2138:60 
TypeError: undefined is not an object (evaluating 'scope.jackpot') in /home/elli0t/Documents/Yeoman Projects/monopoly/test/spec/controllers/main.js (line 20) 
/home/elli0t/Documents/Yeoman Projects/monopoly/test/spec/controllers/main.js:20:17 
PhantomJS 2.1.1 (Linux 0.0.0): Executed 1 of 1 (1 FAILED) ERROR (0.04 secs/0.007 secs) 

Dies ist mein Testfall:

it('should attach a list of jackpot to the scope', function() { 
    expect(scope.jackpot.length).toBe(2); 
    }); 

Und dies ist der Code-Block bin ich versucht, auf den Test auszuführen:

var countInJackpot = localStorageService.get('jackpot'); 
$scope.jackpot = countInJackpot || [ 
    { 
    letter: '$', 
    prize: '$1,000,000 Cash', 
    numbers: ['$611A','$612B','$613C','$614D','$615E','$616F','$617G','$618F'], 
    count: [0,0,0,0,0,0,0,0] 
    }, 
    { 
    letter: '?', 
    prize: '$500,000 Vacation Home', 
    numbers: ['?619A','?620B','?621C','?622D','?632E','?624F','?625G','?626H'], 
    count: [0,0,0,0,0,0,0,0] 
    } 
]; 

Für den Moment möchte ich wirklich nur 1 einfachen Testfall schreiben, damit ich die App bauen kann. Momentan studiere ich Komponententests, aber ich fühle mich immer noch nicht bereit, selbst komplexere Testfälle zu schreiben. Ich werde das für später speichern.

Ich habe bei Bedarf den gesamten Inhalt der Dateien als Referenz beigefügt und kann den Inhalt der Datei "karma.conf.js" bei Bedarf einfügen.

My gist

Ich weiß, dass dieser Fehler auf dieser Seite in vielen anderen Fragen gekommen ist, habe ich durch sie heute den ganzen Tag suchen und keiner von ihnen hat mir geholfen, mit diesem Problem, damit ich meine eigene Post. Wenn weitere Informationen benötigt werden, um dieses Problem zu lösen, lassen Sie es mich wissen. Vielen Dank!

+0

Wie wird 'scope' in Ihrem Test definiert? Scheint, dass ist, wo das Problem ist – Phil

+0

Entschuldigung, ich habe vergessen, den Gist-Link in meinem ursprünglichen Beitrag aufzunehmen, aber ich habe es jetzt hinzugefügt, und ich werde es auch in diesem Kommentar veröffentlichen. Ich würde den Code selbst im Kommentar veröffentlichen, aber es scheint, dass es Einrückungen in Kommentaren ignoriert, und macht mehr als eine Zeile schwerer zu lesen. [Gibt es hier] (https://gist.github.com/Etregoning/b59c15248b3264323933044dbdf743eb) Es ist die Datei am unteren Rand unter dem Hauptcontroller –

+0

StackOverflow-Code-Formatierung erfordert eine Lücke von 4 Leerzeichen links. – Phil

Antwort

1

Ich würde erwarten, dass Sie beide Fälle der localStorageService haben wollen und keine Daten haben. Um dies zu tun, ein Spion für localStorageService (siehe Spies) erstellen und schreiben Sie Ihre Tests wie dieser ...

'use strict'; 

describe('Controller: MainCtrl', function() { 

var scope, localStorageService, localData; 

beforeEach(function() { 
    localData = {}; 

    module('monopolyApp'); 

    localStorageService = jasmine.createSpyObj('localStorageService', ['get', 'set']); 
    localStorageService.get.and.callFake(function(key) { 
     return localData[key]; 
    }); 

    inject(function($rootScope) { 
     scope = $rootScope.$new(); 
    }); 
}); 

it('assigns jackpots from local storage if present', inject(function($controller) { 
    localData.jackpot = 'whatever, does not matter'; 

    $controller('MainCtrl', { 
     $scope: scope, 
     localStorageService: localStorageService 
    }); 

    expect(localStorageService.get).toHaveBeenCalledWith('jackpot'); 
    expect(scope.jackpot).toBe(localData.jackpot); 
})); 

it('assigns jackpots from default array if none present in local storage', inject(function($controller) { 
    $controller('MainCtrl', { 
     $scope: scope, 
     localStorageService: localStorageService 
    }); 

    expect(localStorageService.get).toHaveBeenCalledWith('jackpot'); 
    expect(scope.jackpot.length).toEqual(2); 

    // maybe include some other checks like 
    expect(scope.jackpot[0].letter).toEqual('$'); 
    expect(scope.jackpot[1].letter).toEqual('?'); 
})); 

}); 
+0

Wäre das die gesamte Skriptdatei, anstatt, was ich bereits verwende? Ich habe bemerkt, dass Sie MainCtrl nicht als Variable eingeschlossen haben, ist das nicht notwendig? Es tut mir leid, ich bin sehr neu in der Unit-Tests, also versuche ich immer noch, Sinn zu machen. Danke für das ausführliche Beispiel, ich werde es ausprobieren, sobald ich einen Sinn habe, was alles macht. –

+0

@EliotTregoning Es ist jetzt; Ich hatte ursprünglich den 'describe' Wrapper ausgeschlossen, aber ich habe es jetzt hinzugefügt. Ich habe den Controller keiner Variablen zugewiesen, weil es keinen Sinn hatte, er wird nirgends verwendet. – Phil

+0

Danke, ich wollte es nicht einfach kopieren/einfügen, ich schreibe es lieber von Hand mit deinem Beitrag als Referenz, weil es mir besser in Erinnerung bleibt, ich wollte einfach nicht raus mein Skript, um Ihre Version zu schreiben und am Ende Dinge zu verlassen. Ich versuche das jetzt und werde Sie wissen lassen, wie es geht! –

1

In Ihrem Testfall sollte Umfang $ Umfang sein?

ODER

Sie haben wahrscheinlich nicht Setup Ihre Umgebung Tests in Ihrem Controller zu laden.

Hier ist ein Beispiel von mir auf einen Controller testen ... Angular macht das Setup ein wenig zweifelhaft zu lernen, aber sobald Sie den Fluss verstehen. Es ist ziemlich toll :)

Ich werde versuchen und so viele Kommentare hinzufügen, um jedes Stück zu erklären, wie ich kann ... aber lassen Sie mich wissen, wenn Sie Klärung brauchen. Sie könnten Jasmin verwenden, aber denken Sie daran, das ist mocha, ich benutze die eckige Bibliothek, die über die karma.conf geladen wurde.

describe('myController', function() { 
    var $scope, 
    createController; 

    // Runs before each test. Re-extantiating the controller we want to test. 
    beforeEach(inject(function($injector) { 
    // Get hold of a scope (i.e. the root scope) 
    $scope = $injector.get('$rootScope'); 

    // The $controller service is used to create instances of controllers 
    var $controller = $injector.get('$controller'); 

    createController = function() { 
     // Creates the controller instance of our controller. 
     // We are injecting $scope so we will have access to it 
     // after the controllers code runs 
     return $controller('myCtrl', { 
     '$scope': $scope 
     }); 
    }; 
    })); 

    describe('#myFunction', function() { 
    it('jackpot should contain two objects', function() { 
     expect($scope.jackpot.length).to.equal(2); 
    }); 
    }); 
}); 

Hoffnung, die geholfen hat. Hier sind einige der Ressourcen, die ich gelernt habe :) Viel Glück!

+1

Ja, ich benutze Jasmine. Ich benutze die gleichen Methoden, die ich für das Yeoman-Tutorial verwendet habe, das die Grundlagen des Komponententests abdeckte und den Umfang auf diese Weise definierte, ohne dass das $ für die einfache Todo-App im Tutorial funktionierte, aber nicht mit die App, die ich gemacht habe. Danke für die Ressourcen, ich werde sie auf jeden Fall überprüfen! Du hast eine großartige Arbeit geleistet, indem du beschreibst, wie es gemacht wird, aber ich bin immer noch ein wenig verwirrt in der Syntax für Komponententests ... vielleicht weil es in Mokka ist und ich bis jetzt Jasmine benutze, aber danke für die Info! –