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

Posted

技术标签:

【中文标题】Ember CLI 控制器测试:未捕获的 TypeError:无法读取 null 的属性“transitionToRoute”【英文标题】:Ember CLI Controller Test: Uncaught TypeError: Cannot read property 'transitionToRoute' of null 【发布时间】:2014-10-24 14:25:34 【问题描述】:

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

未捕获的类型错误:无法读取 null 的属性“transitionToRoute”

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") 行被删除时,测试通过;否则,测试失败。

我怎样才能修复这个错误,同时仍然保持我的控制器逻辑?

【问题讨论】:

transitionToRoute 没有返回空值,它空值。 this 不是你怀疑的那样,我想。我对咖啡脚本不感兴趣,这让我不用担心太多:) 如果您找到了解决方案,请将其作为答案发布,因为我面临着类似的问题。 【参考方案1】:

解决方法:如果 targetnull,则绕过 transitionToRoute。比如:

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

我遇到了同样的错误并稍微研究了 Ember 源代码。在我的例子中,这个错误是由ControllerMixin 抛出的,因为get(this, 'target') 在this line 是null。在没有进一步上下文的情况下,测试模块可能不知道target 在这样的控制器单元测试中应该是什么,因此您可能需要手动设置它或绕过它。

【讨论】:

【参考方案2】:

由于您对转换本身不感兴趣,您可以在控制器上存根 transitionToRoute 方法。

JS:

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

咖啡:

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

【讨论】:

【参考方案3】:

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

一个可能的解决方法是,如果您将您的 transitionToRoute 调用移动到路由而不是在控制器中。这样,您的控制器将向其路由发送操作,并且您将仅在路由中保持路由。

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

【讨论】:

以上是关于Ember CLI 控制器测试:未捕获的 TypeError:无法读取 null 的属性“transitionToRoute”的主要内容,如果未能解决你的问题,请参考以下文章

使用通过 ember-cli 创建的应用程序获取“未捕获的错误:断言失败:Ember 视图需要 1.7 和 2.1 之间的 jQuery”

Ember.js - 将 ember-cli-mirage 用于假模型时未找到模型

Ember CLI 和代码覆盖率

Ember Mirage - 无法捕获响应

如何调试在 phantomjs 中运行的 ember-cli 测试

如何在验收测试中模拟 Ember-CLI 服务?