2014-08-30 1 views
4

У меня есть контроллер я тестирование с Ember CLI, но обещание контроллера не рассосется, а transitionToRoute метод контроллера возвращается null:Ember CLI Test Controller: Uncaught TypeError: Не удается прочитать свойство «transitionToRoute» в нуль

Uncaught TypeError: Cannot read property 'transitionToRoute' of null

login.coffee

success: (response) -> 
    # ... 

    attemptedTransition = @get("attemptedTransition") 
    if attemptedTransition 
     attemptedTransition.retry() 
     @set "attemptedTransition", null 
    else 
     @transitionToRoute "dashboard" 

login-test.coffee

`import {test, moduleFor} from "ember-qunit"` 

moduleFor "controller:login", "LoginController", { 
} 

# Replace this with your real tests. 
test "it exists", -> 
    controller = @subject() 
    ok controller 

### 
    Test whether the authentication token is passed back in JSON response, with `token` 
### 
test "obtains authentication token", -> 
    expect 2 
    workingLogin = { 
     username: "[email protected]", 
     password: "pass" 
    } 
    controller = @subject() 
    Ember.run(-> 
     controller.setProperties({ 
      username: "[email protected]", 
      password: "pass" 
     }) 
     controller.login().then(-> 
      token = controller.get("token") 
      ok(controller.get("token") isnt null) 
      equal(controller.get("token").length, 64) 
     ) 
    ) 

Когда линия @transitionToRoute("dashboard") удалена, тест проходит; в противном случае тест не выполняется.

Как я могу исправить эту ошибку, сохраняя при этом мою логику контроллера?

+0

'transitionToRoute' не возвращает null, это * is * null. Думаю, это не то, что вы подозреваете. Мой интерес к coffeescript не позволяет мне слишком беспокоиться об этом :) –

+0

Если вы нашли решение, пожалуйста, разместите его как ответ, так как сталкивайтесь с подобной проблемой. – Mawaheb

ответ

2

Работать вокруг: обход transitionToRoute если target is null. Что-то вроде:

if (this.get('target')) { 
    this.transitionToRoute("dashboard"); 
} 

Я столкнулся с той же ошибкой и немного выкопал в исходный код Ember. В моем случае эта ошибка вызывается ControllerMixin, потому что get(this, 'target') является null по адресу this line. Вероятно, тестовый модуль не имеет представления о том, что target должно быть в тестовом блоке контроллера, например, без дополнительного контекста, поэтому вам может потребоваться вручную установить его или просто обойти его.

0

Поскольку вы не заинтересованы в самом переходе, вы можете просто отключить метод transitionToRoute на контроллере.

JS:

test('Name', function() { 
    var controller = this.subject(); 
    controller.transitionToRoute = Ember.K; 
    ... 
} 

Кофе:

test "it exists", -> 
    controller = @subject() 
    controller.transitionToRoute = Ember.K 
    ok controller 
0

Не уверен, почему метод transitionToRoute не определен, когда вы выполняете его внутри модульного тестирования - это, вероятно, связано с тем, что контекст выполнения другой.

Одним из возможных способов обхода этого может быть, если вы переместите свой переходный вызов ToRoute на маршрут вместо того, чтобы находиться в контроллере. Таким образом, ваш контроллер отправит действие на свой маршрут, и вы будете продолжать маршрутизацию только по маршруту.

Существует большая дискуссия вокруг которой лучше практика - маршрутизация с контроллера или нет, но это еще одна история.