Wie bekomme ich mit Ember (cli) einen Abnahmetest, um auf ein Versprechen zu warten?

In meiner Ember-App habe ich derzeit ein Modell mit einemfindResults -Funktion, die ein Versprechen zurückgibt, das eine Google Places-Bibliothek einhüllt, um Ergebnisse für die automatische Vervollständigung abzurufen. Um dies in meiner Benutzeroberfläche zu verwenden, richte ich eine PromiseMixin-Steuerung ein. Ich weise den Controller an, das @ zu beobachtsearchText value, und wenn sich dies ändert, aktualisiere ich den Versprechenwert des Controllers so, dass er das Versprechen ist, das vom @ zurückgegeben wirfindResults -Funktion, aber mit dem neuen Wert vonsearchText. Dies funktioniert gut, wenn ich mit der App im Browser spiele. Wenn ich jedoch meine Akzeptanztests durchführe, scheint der Test zu enden, bevor das Versprechen zurückgegeben wird, und daher schlagen die Tests fehl. Ich werde die relevanten Dateien unten einfügen.

Ich bin mir nicht sicher, wie ich Ember sagen soll, dass er auf das Versprechen warten soll, das während des Tests zu lösen ist.

app / services / google-autocomplete-location.js

import Ember from "ember";

var googleAutocompleteLocation = Ember.Object.extend({
  placeId: null,
  description: null
});

googleAutocompleteLocation.reopenClass({
  findResults: function(query) {
    var self = this;
    var promise = new Ember.RSVP.Promise(function(resolve, reject) {
      var autocompleteService = new google.maps.places.AutocompleteService();

      return autocompleteService.getPlacePredictions({ input: query },
        function(predictions, status) {
          if (status !== google.maps.places.PlacesServiceStatus.OK) {
            Ember.run(null, reject, status);
          }
          else {
            Ember.run(null, resolve, self._decorateGoogleResults(predictions));
          }
        });
    });

    return promise;
  },

  _decorateGoogleResults: function(predictions) {
    var locations = [];

    predictions.forEach(function(prediction) {
      locations.push(
        googleAutocompleteLocation.create({
          placeId: prediction.place_id,
          description: prediction.description
        })
      );
    });


    return locations;
   }
});

export default googleAutocompleteLocation;

app / controller / index.js

import Ember from "ember";
import GoogleLocation from "../services/google-location";
import GoogleAutocompleteLocation from '../services/google-autocomplete-location';

export default Ember.ArrayController.extend(Ember.PromiseProxyMixin, {
  searchText: '',
  map: null,
  mapUrl: null,

  actions: {
    submit: function() {
      return this.transitionToRoute('entries.new');
    }
  },

  highlightedResult: function() {
    if (this.get('model').length) {
      return this.get('model')[0];
    } else {
      return null;
    }
  }.property('model'),

  setMap: (function() {
    if (this.get('highlightedResult') === null) {
      return this.set('map', null);
    } else {
      if (this.get('map') === null) {
        return this.set('map', GoogleLocation.create({
          mapContainer: Ember.$('.maps-info'),
          placeId: this.get('highlightedResult').placeId
        }));
      } else {
        return this.get('map').set('placeId', this.get('highlightedResult').placeId);
      }
    }
  }).observes('highlightedResult'),

  searchTextChanged: (function() {
    if (this.get('searchText').length) {
      this.set('promise',
        GoogleAutocompleteLocation.findResults(this.get('searchText')));
      console.log(this.get('promise'));
    } else {
      this.set('model', []);
    }
  }).observes('searchText')
});

tests / accept / create-new-entry-test.js

test('finding a location', function() {
  expect(1);
  visit('/');
  click('.location-input input');
  fillIn('.location-input input', "Los Angeles, CA");

  andThen(function() {
    var searchResult = find('.search-results ul li:first a').text();

    equal(searchResult, 'Los Angeles, CA, United States');
  });
});

Antworten auf die Frage(4)

Ihre Antwort auf die Frage