2015-11-13 2 views
1

Я пытаюсь написать приемочный тест, чтобы узнать, соответствует ли определенное свойство в модели для маршрута, которое я посещаю, что я утверждаю.Получить модель маршрута после посещения в приемочном тесте

Я не выводя информацию на страницу с помощью этого маршрута, вместо этого я буду сохранять часть ее в localstorage с помощью ember addon. Поэтому я обычно понимаю, что могу использовать find(), чтобы найти элемент на странице и проверить его содержимое, чтобы определить, разрешена ли модель, но это не сработает для этого случая.

В тесте приема у меня есть эта установка (с использованием мираж BTW)

test('Returns a user', function(assert) { 
    // Generate a user 
    var user = server.create('user',{first_name: 'Jordan'}); 
    // Visit the index page with the users short_url 
    visit('/' + user.short_url); 
    var route = this.application.__container__.lookup('route:index'); 

    // Assert that the model the user we created by checking the first name we passed in 
    assert.equal(route.model.first_name,'Jordan','Model returns user with first name Jordan'); 
}); 

Но когда я запускаю тест он показывает результат, будучи undefined

UPDATE:

После пытаясь ответить Даниэлю Кмаку, я до сих пор не могу его передать. Это маршрут код, я работаю с

import Ember from 'ember'; 
import LocalUser from 'bidr/models/user-local'; 

export default Ember.Route.extend({ 
    localUser: LocalUser.create(), 
    navigationService: Ember.inject.service('navigation'), 
    activate() { 
     this.get('navigationService').set('navigationMenuItems', []); 
    }, 
    beforeModel() { 
     this.localUser.clear(); 
    }, 
    model(params) { 
     var self = this; 
     return this.store.queryRecord('user',{short_url: params.short_url}).then(function(result){ 
      if(result){ 
      self.set('localUser.user', { 
       "id": result.get('id'), 
       "first_name": result.get('first_name'), 
       "active_auction": result.get('active_auction'), 
       "phone": result.get('phone') 
      }); 
      // transition to event page 
      self.transitionTo('items'); 
      } else { 
       self.transitionTo('home'); 
      } 
     }); 
    } 
}); 

А тест выглядит так

import Ember from 'ember'; 
import { module, test } from 'qunit'; 
import startApp from 'bidr/tests/helpers/start-app'; 


module('Acceptance | index route', { 
    beforeEach: function() { 
    this.application = startApp(); 
    }, 

    afterEach: function() { 
    Ember.run(this.application, 'destroy'); 
    } 
}); 

test('Returns a user', function(assert) { 
    var user = server.create('user',{first_name: 'Jordan'}); 

    visit('/' + user.short_url); 

    var route = this.application.__container__.lookup('route:index'); 

    andThen(function() { 
    assert.equal(route.get('currentModel.first_name'),'Jordan','Model returns user with first name Jordan'); 
    }); 
}); 

Весь код работает как и должно быть в разработке.

+0

Я бы попытался использовать 'controller.model' вместо' route.model', чтобы избежать асинхронного поведения – artych

+0

Итак, как вы получаете доступ к контроллеру в тесте? Я попытался изменить поиск на 'controller: index', но я до сих пор не могу получить к нему доступ – Jordan

+0

Можете ли вы поделиться своим кодом маршрутизатора для этого маршрута, который вы посещаете, и пример значения user.short_url, а также модельную функцию этого маршрута? –

ответ

0

Итак, я экспериментировал с тестированием в Эмбер, и это, кажется, вы должны быть хорошо с получением модели в andThen крючке:

test('returns a user', function(assert) { 
    visit('/'); // visit your route 

    var route = this.application.__container__.lookup('route:index'); // find your route where you have model function defined 

    andThen(function() { 
    console.log(route.get('currentModel')); // your model value is correct here 
    assert.equal(currentURL(), '/'); // make sure you've transitioned to correct route 
    }); 
}); 

Принимая код он должен работать нормально:

test('Returns a user', function(assert) { 
    var user = server.create('user',{first_name: 'Jordan'}); 

    visit('/' + user.short_url); 

    var route = this.application.__container__.lookup('route:index'); 

    andThen(function() { 
    assert.equal(route.get('currentModel.first_name'),'Jordan','Model returns user with first name Jordan'); 
    }); 
}); 

Следует отметить, что вы можете получить доступ к модели через route.currentModel.

Для моей модели:

export default Ember.Route.extend({ 
    model() { 
    return Ember.RSVP.hash({ 
     simple: 'simpleValue', 
     promise: Ember.RSVP.resolve(5) 
    }); 
    } 
}); 

В andThen с console.log(route.get('currentModel')); я получил:

Object {simple: "simpleValue", promise: 5} 

Записан.

+0

Когда я перехожу к этому, я получаю «TypeError: Can not read property» модели undefined' и запись маршрутной переменной в консоль возвращает undefined. Однако при ведении журнала «route: index» маршрут в консоль возвращает класс маршрута. – Jordan

+0

Мой ответ обновлен. Проверь это сейчас. –

+0

Не пропустите, я добавлю код маршрута и текущий тест в вопросе – Jordan

Смежные вопросы