2016-05-19 12 views
1

Wenn ich das Antwortobjekt aus dem httpbackend ein einzelnes Objekt anstelle eines Arrays für "Daten" machen, funktioniert es gut. Aber sobald ich es zu einem Array mache (sogar ein einzelnes Element-Array), will es nicht funktionieren und gibt mir eine Fehlermeldung, dass undefined kein Objekt ist (Bewertung von "booking.Student.studentName"). Unten ist der Code. Irgendwelche Ideen? Ist es, weil lodash nicht sein Ding macht?Jasmin undefined kein Objekt, kann keinen Schlüssel finden

Ich habe die folgende Funktion in meinem Controller

$scope.initBookings = function() { 
    return $http.get('/api/bookings').then(function(response) { 
    return $scope.bookings = _.map(response.data, function(booking) { 
     booking.studentName = booking.Student.studentName; 
     booking.slotDay = booking.Slot.day; 
     booking.slotTime = booking.Slot.time; 
     booking.subjectName = booking.Subject.name; 
     return booking; 
    }); 
    }); 
}; 

Und mein Test ist die folgende

it('should store bookings into $scope.bookings and create a $scope.bookingsTable', function() { 
    expect(this.scope.bookings).toBeUndefined(); 
    this.scope.initBookings(); 
    this.httpBackend.expect('GET', '/api/bookings'); 
    this.httpBackend.flush(); 
    expect(this.scope.bookings).toBeDefined(); 
}); 

this.httpBackend.whenGET('/api/bookings').respond(function() { 
    return [ 
    200, { 
     data: [ 
     { 
      Student: { 
      studentName: 'John Die' 
      }, 
      Slot: { 
      day: 'today', 
      time: 'now' 
      }, 
      Subject: { 
      name: 'maths' 
      } 
     }, { 
      Student: { 
      studentName: 'Jane Die' 
      }, 
      Slot: { 
      day: 'tomorrow', 
      time: 'before' 
      }, 
      Subject: { 
      name: 'mathamatix' 
      } 
     } 
     ] 
    } 
    ]; 
}); 

es kehrt diese

Object{data: [Object{Student: ..., Slot: ..., Subject: ...}, Object{Student: ..., Slot: ..., Subject: ...}]} 
+0

Es ist merkwürdig, dass Sie die gleiche Variable ('booking') verwenden, um Daten gleichzeitig abzurufen und zuzuweisen. Haben Sie versucht, eine console.log dieser Variable zu machen, um zu sehen, was sie zurückgibt? –

+0

wie viele zurück !!! – morels

+0

so? Hast du das Problem gelöst? – morels

Antwort

0

Die Controller-Funktion ist ein Chaos.

Beachten Sie, dass Sie seltsamen synchronen/asynchronen Code verwenden, um Daten vom Server abzurufen.

Um zu machen es besser lesbar und testbar pls es umschreiben vollständig async:

$scope.bookings = []; 

$scope.initBookings = function() { 
    $http.get('/api/bookings').then(function(response) { 

    $scope.bookings = _.map(response.data, function(booking) { 
     var out = { 
     studentName: booking.Student.studentName, 
     slotDay: booking.Slot.day, 
     slotTime: booking.Slot.time, 
     subjectName: booking.Subject.name 
     }; 
     return out; 
    }); 
    }); 
}; 

$scope.initBookings(); 

Der Körper lodash inneren Schleife anderen Variablen in In den anderen zuordnet, so geschoben das Ergebnisobjekt in $scope.bookings werden: