如何使用qunit在Ember单元测试中依赖商店作为服务?

Kev*_*hey 11 ember.js ember-data ember-cli ember-qunit

根据博客文章ember-data版本1.0.0-beta.16,商店现在可以用作服务:

TweetComposerComponent = Ember.Component.extend({
  store: Ember.inject.service()      
});
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何qunit对这样的组件进行单元测试.我尝试过以下方法:

moduleForComponent('tweet-composer', {
  needs: ['service:store']
});
Run Code Online (Sandbox Code Playgroud)

和:

moduleForComponent('tweet-composer', {
  needs: ['store:main']
});
Run Code Online (Sandbox Code Playgroud)

当我做前者时,我得到一个错误Attempting to register an unknown factory: 'service:store',如果我做后者那么store就是undefined.

思考?

(我正在写一个ember-cli样式应用程序).

更新:

在ember-test-helpers repo中似乎存在一个未解决的问题.

在我等待这个修复的同时,我制作了一个可以作为一种间隙测量的辅助工具(coffeescript):

`import TestModuleForComponent from 'ember-test-helpers/test-module-for-component'`
`import { createModule } from 'ember-qunit/qunit-module'`

# This assumes the last argument, the callbacks, is present, although it
# does support the description being an optional argument.
moduleForStoreComponent = ->
  args = Array.prototype.slice.call arguments
  callbacks = args[args.length-1]
  # Wrap the original beforeEach callback in a modified version that
  # also sets up the store for the test container.
  originalSetup = callbacks.beforeEach
  callbacks.beforeEach = ->
    DS._setupContainer(@container)
    originalSetup.call(@) if originalSetup
  callbacks.store = ->
    @container.lookup('store:main')
  args.unshift TestModuleForComponent
  createModule.apply @, args

`export default moduleForStoreComponent`
Run Code Online (Sandbox Code Playgroud)

giv*_*nse 13

除了您正在测试的代码/组件/单元之外,单元测试是一切都能正常工作的地方.

因此,即使store应该假设工作正常(0错误/错误).

这样的东西应该在你的测试中起作用:

moduleForComponent('tweet-composer', {
    beforeEach: function() {
        this.subject({
            store: {/*empty object*/}
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

如果部分测试依赖于从商店检索的数据,您可以执行以下操作:

this.subject({
    store: {
        find: function() {
          var mockedModel = Ember.Object.create({/*empty*/});
          return mockedModel;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

这是为了保持"单元测试"的状态,如果你开始包含并注册你的应用程序中的其他对象,你将实际编写集成测试.

注意:

通常,直接在组件中查找模型是反模式,您应该更喜欢在包含该组件的模板中传入所需的任何模型.

http://discuss.emberjs.com/t/should-ember-components-load-data/4218/2?u=givanse

  • 是的,虽然我正在使用`http-mocks`作为我的模型装置,并且很高兴能够结合实际的模拟数据来测试组件,这些数据位于中心位置并且不会分布在我的所有数百个测试文件中.我意识到这意味着它本身并不是一个"单元测试",但它是我认为最有用的测试粒度.我很感激你的答案,并且会对它进行投票,因为我学会了如何使用`subject`进行存根,但我仍然坚持要求另一个能让我按照自己的意愿行事的答案. (2认同)