编写Ember.js异步测试助手和涉及异步操作的测试

时间:2015-09-15 18:22:41

标签: ember.js ember-data

我试图找出如何正确编写Ember测试助手,该助手执行自己的异步操作和测试本身涉及异步操作,不一定包含在异步助手中。 Ember站点herehere上的示例都显示异步测试助手,这些助手仅通过调用预先存在的异步助手而不是创建自己的异步条件的代码构建。

背景:我正在开发一个服务,该服务将拥有一个由Ember + Ember Data提供的REST后端。我想写一些与实际服务器对话的测试代码,以便我们能够详细说明Ember-Data如何与服务器交互。 (在您上下关于集成测试应如何使用虚假数据以便它们可以在CI模式下运行之前,我们所做的是设置一个单独的 Ember应用程序,其唯一目的是生活就是通过Ember Data来运行数据模型,以便调试服务器。因此,这些都是服务器测试,旨在确保服务器和Ember之间的兼容性数据,而不是Ember应用程序本身的集成测试。)

因此,一些测试想要做的是:

  1. 对服务器执行AJAX查询以触发它设置某个数据集。 (基本上,在服务器内调用一些特殊的测试代码来创建适当的前提条件。)
  2. 使用Ember Data API以便从服务器检索数据(或向其写入数据),方法与" real" Ember申请会。
  3. 确保我们得到了我们的期望,或者之后服务器中的数据看起来是正确的。
  4. 前两个操作都显然是异步的。第一个很明显是一个很好的异步助手。第二个并不一定是帮助者,因为每次调用都会有所不同,但显然测试本身需要等待来自DS.store的方法的承诺。

    最后,我知道的其他事情:

    1. 我理解Ember测试助手如何工作的基本理论。 (链式承诺等)
    2. 内置异步助手(例如clickvisit)均以return app.testHelpers.wait();
    3. 结束
    4. wait返回RSVP.Promise的实例,该实例执行大量处理以确保在结算之前对事物进行了或多或少的清理,包括处理优秀的AJAX查询,测试服务员等
    5. 如果需要,
    6. wait可以与测试服务员互动。
    7. 因此,似乎如果我的异步助手与Ember' s(即return app.testHelpers.wait();)做同样的事情,这对我的AJAX助手来说已经足够了,因为wait会照顾到等待AJAX​​事务完成。然而,这并不是必要的回答更广泛的问题。

      好的,现在真正的问题:

      1. 如果我想编写自己的任意异步助手,我是否足以返回将在适当时间解决的RSVP.Promise实例?或者是否有必要实际使用wait()机制(并可能测试服务员),因为wait机制的行为有一些额外的Ember依赖性?

      2. Ember是否对涉及中游异步操作的测试有任何特殊要求?或者QUnit mechanisms for async tests是否足够?

      3. Ember是否有任何"包装"对于QUnit异步的东西? (它"隐藏"它的测试调用后面的QUnit-ness的方式。)

      4. Ember与服务器的数据交互是否依赖于Ember运行循环?

      5. 好吧,我认为这对于一个问题来说已经足够了。 :)我非常感谢任何愿意教育我的人。

1 个答案:

答案 0 :(得分:0)

尝试用我对这些可能不完整的问题的经验回答您的问题:

  1. 您只需注册一个返回RSVP.Promise实例的异步测试助手即可。然后,andThen块将等待您的承诺在运行之前解析,就像访问内置的异步帮助程序一样。
  2. Ember没有关于异步操作的具体要求,您应该使用Qunit机制。当您编写异步测试时,有些细微差别,' auto'在测试模式下禁用运行循环,因此您必须在Ember.run语句中包装操作对象或在其上设置属性的语句
  3. AFAIK除了模块(moduleForComponent等等)外,没有任何Ember包装器。
  4. Ember数据交互需要嵌套在Ember.run语句中,因为它们正在操作对象和存储,这些需要安排在Ember运行循环中运行。当您运行应用程序时,Ember会自动为您调度一系列调用,但这在测试模式下已禁用
  5. 希望这有帮助