1

这些是我一般测试的第一步,所以我不知道如何处理它。在生产中,我使用 REST 适配器 - 开发时的固定装置。

例如有这个用户模型:

Sks.User = DS.Model.extend
  name: DS.attr("string")
  email: DS.attr("string")

  gravatar: Ember.computed(->
    email = @get("email") || ""
    "http://www.gravatar.com/avatar/" + MD5(email)
  ).property("email")

  firstName: Ember.computed(->
    fName = @get('name').split(' ')[0]
  ).property("name")

  lastName: Ember.computed(->
    lName = @get('name').split(' ')[1]
  ).property("name")

如何使用带有 Jasmine 的 TDD/BDD 对其进行测试?我想我应该测试一下逻辑:名字、姓氏和 gravatar,但我怎样才能将它翻译成 Jasmine?我最近读了很多关于测试的文章,但是你知道的理论与实践不同,我只是碰壁了。:(

我应该模拟服务器来获取 JSON 还是应该使用固定装置?

4

1 回答 1

0

我认为对于模型的单元测试,你根本不应该处理服务器(甚至模拟服务器)——这取决于适配器。模型的单元测试将用于计算属性(gravatar, firstname, lastname在本例中)和其他逻辑(生命周期回调、操作等)。您可以相当简单地测试它们——它们大多与服务器隔离。像这样的东西:

describe "gravatar property", ->
  it "should append the md5 of the email to the gravatar path", ->
    user = Sks.User.createRecord name: "my name", email: "abc@def.com"
    expect(user.get('gravatar')).toBe "http://www.gravatar.com/avatar/#{MD5(user.get('email')}"

如果您正在使用 Ember-Data 的 RESTAdapter,您可以假设它已经过良好测试(尽管您可能希望编写更高级别的集成测试以显示您的模型正确加载了适配器数据)。如果您正在编写自己的适配器,则应该为此进行单独的单元测试。

要加载应用程序的哪些部分

对于单元测试,您实际上只需要加载主命名空间(例如Sks = Ember.Application.create(...))和模型定义(例如Sks.User = DS.Model.extend(...))及其依赖项。在创建模型时,可以通过传入模拟/存根来存根其他所有内容(请参阅:什么是依赖注入?

我之前在测试环境中使用 Ember 的路由器自动加载时遇到过一些问题;您可能想要禁用路由器(尽管这只是在您为测试加载所有内容时才会出现问题——我使用的是 jasminerice,因此所有 javascript 资产都由 Rails 服务器编译,并且测试在浏览器中运行) - - 我认为在新路由器中您可以使用deferReadinesshttp ://emberjs.com/api/classes/Ember.Application.html#method_deferReadiness 。以前我在设置autoinit: false.

于 2013-04-21T08:21:47.720 回答