Ember 测试:无法读取 null 的属性“createRecord”

Posted

技术标签:

【中文标题】Ember 测试:无法读取 null 的属性“createRecord”【英文标题】:Ember Testing: Cannot read property 'createRecord' of null 【发布时间】:2014-10-31 12:00:27 【问题描述】:

似乎store 在我的 Ember 测试中不可用,无论是在 ObjectController 的上下文中还是在任何单元测试中。我的单元测试:

`import test, moduleFor from "ember-qunit"`
`import DS from "ember-data"`

moduleFor "controller:register", "RegisterController", 


test "store is working", ->
    expect 1
    controller = @subject()
    Ember.run(->
        sampleUser = controller.get("store").createRecord("user", 
            username: "myuser"
            password: "otherpassword"
        )
        ok(sampleUser instanceof DS.Model)
    )

测试将给出:

在测试 #1 中死亡 (http://localhost:4200/assets/vendor.js:73539:13) 在 eval (app/tests/unit/controllers/register-test.js:19:5) 在 requireModule (http://localhost:4200/assets/vendor.js:54:29) 在http://localhost:4200/assets/test-loader.js:14:29: 无法读取 null 的属性“createRecord”

谁能解释为什么我无法从我的测试或控制器本身(运行测试时)访问DS 功能?

【问题讨论】:

您能否手动创建一个 store 实例 - 然后将其注入 /add 到您的控制器(正在测试中)以验证它是否按预期工作? 【参考方案1】:

您可以将 ember-data 存储添加到单元测试的“需求”部分。您还需要将任何正在创建的模型添加到“需求”部分,如下所示:

needs: ['service:store', 'model:user']

这会将 store 的真实实例注入到正在测试的对象(控制器、组件、路由等)中。

【讨论】:

【参考方案2】:

因为 ember-qunit 不会将 store 注入到您的控制器中,所以它适用于单元测试,而不是集成测试。并且 Ember Data 的存储超出了该控制器的范围。

【讨论】:

好的,那我该如何解决? 你想在这里测试什么?灰烬数据?我会将单元测试添加到 Ember Data 的框架中,而不是您的框架中。和测试 jQuery 一样。 github.com/emberjs/data/blob/master/packages/ember-data/tests/… 嗯...我有很多控制器调用store,我想防止我的控制器单元测试失败而不是执行集成测试。我想这一定是一个非常普遍的情况。我有点惊讶它没有在 Ember 文档中直接解决,但就这样吧。 @Kingpin2k 你有什么建议吗?我确实看过之前发送的链接,但恐怕我没有从中获得足够的信息来解决这个问题。 在你的控制器上注入一个虚假的 store,返回你所期望的。 Ember-qunit 并不是真正为 Ember Data 构建的,它是为 Ember 构建的,因此它并没有真正考虑 Ember Data。

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

Ember cli mirage 错误:补丁处理程序无法读取 null 的属性更新

测试无法读取 null 的属性 InnerHTML

NuxtJS Typescript click.native '无法读取 null 的属性'测试''

尝试测试获取所有路由时出现“TypeError:无法读取 null 的属性 '1'”?

Angular 混合应用程序测试“无法读取 null 的属性‘nativeElement’”

Karma 测试 Angular - TypeError:无法读取 null 的属性“recipientAddressId”