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】:
解决方法:如果 target
是 null
,则绕过 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 用于假模型时未找到模型