Ember CLI控制器测试:未捕获的TypeError:无法读取null的属性“transitionToRoute”

时间:2014-08-30 23:11:56

标签: unit-testing ember.js coffeescript qunit ember-cli

我有一个控制器我正在使用Ember CLI进行测试,但控制器的承诺无法解决,因为控制器的transitionToRoute方法正在返回null

  

未捕获的TypeError:无法读取属性' transitionToRoute'为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: "user@pass.com",
        password: "pass"
    }
    controller = @subject()
    Ember.run(->
        controller.setProperties({
            username: "user@pass.com",
            password: "pass"
        })
        controller.login().then(->
            token = controller.get("token")
            ok(controller.get("token") isnt null)
            equal(controller.get("token").length, 64)
        )
    )

当删除行@transitionToRoute("dashboard")时,测试通过;否则,测试失败。

如何在保持控制器逻辑的同时修复此错误?

3 个答案:

答案 0 :(得分:2)

解决方法:如果transitionToRoutetarget,则绕过null。类似的东西:

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

我遇到了同样的错误并且稍微挖了一下Ember源代码。在我的情况下,ControllerMixin会抛出此错误,因为get(this, 'target')this line处为null。如果没有进一步的上下文,测试模块可能不知道在这样的控制器单元测试中target应该是什么PdfPCell imagecell= new PdfPCell(); imagecell.add element(myImage); imagecell.setHorizontalAlignment(Element.ALIGN_RIGHT); ,所以你可能需要手动设置它或者只是绕过它。

答案 1 :(得分: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

答案 2 :(得分:0)

在单元测试中执行它时,不确定为什么transitionToRoute方法未定义 - 它可能与执行上下文不同的事实有关。

一种可能的解决方法是将transitionToRoute调用移动到路径而不是它在控制器中。这样你的控制器就会向它的路线发送动作,你只会在路线上保持路线。

围绕哪个更好的做法进行了大讨论 - 从控制器路由到否,但这是另一个故事。