1

我正在尝试使用 DS.FixtureAdapter 对 ember-data 进行 Jasmine 测试(使用当前主机)。我已经尝试了以下代码的数十种变体(尝试创建和不尝试创建应用程序命名空间)。我还进入了 ember-data 源尝试查看发生了什么,并引用了 ember-data 本身中的测试作为示例。

我还尝试了 Person.find(1) 的变体,使用 Ember.run 块和 Jasmine wait()'s。

无论我尝试什么,store.find(Person, 'test')都会返回一个结果,但尝试获取其中一个属性会导致 null (测试断言失败)。我没看到什么?谢谢你的帮助!

describe "a test", ->
  store = null
  Person = null

  beforeEach ->

    store = DS.Store.create
      revision: 11
      adapter: 'DS.FixtureAdapter'

    Person = DS.Model.extend
      firstName: DS.attr('string')
      lastName: DS.attr('string')
      age: DS.attr('number')

  it "works or does it", ->
    Person.FIXTURES = [{
      id: 'test'
      firstName: 'Kyle'
      lastName: 'Stevens'
      age: 30
      }]

    kyle = store.find(Person, 'test')
    expect(Em.get(kyle, 'firstName')).toEqual('Kyle')
4

1 回答 1

3

无论我尝试什么, store.find(Person, 'test') 都会返回一个结果,但尝试获取其中一个属性会导致 null (测试断言失败)。我没看到什么?谢谢你的帮助!

这是一个时间问题。当您调用store.find()它时,它会异步运行查询并返回模型承诺。这意味着当控制权返回到您的测试时,查询仍在运行(或计划运行),从而导致预期失败。

这就是我们喜欢 ember 的地方,这意味着您的应用程序可以将 kyle 视为数据存在,并相信当数据可用时,值将通过绑定自动更新。

当然,当它阻止你的测试通过时,所有这些魔法并不是那么好。以下是一些替代方法:

1) 注册didLoad回调

kyle = store.find(Person, 'test');
kyle.on('didLoad', function() {
  console.log('should = kyle: ', Em.get(kyle, 'firstName'));
});

2) 而不是didLoad可以使用更多的黑盒测试方法,只需在调用 find 后 100 毫秒内验证名称是否正确设置 - 当然这会导致脆弱的测试 Ember.run.later(this, function() { console.log ('should = kyle: ', Em.get(kyle, 'firstName')); console.log('should = kim: ', Em.get(App.kim, 'firstName')); }, 100);

我相信在 jasmine 测试中,您可以将设置代码包装在 runs() 方法中,并用于waitsFor验证该值是否已按预期设置:

  waitsFor(function() {
    return Em.get(kyle, 'firstName') == 'Kyle';
  }, "x to be set to 5", 100);

请参阅此 JSBIN 以了解工作(非茉莉花)示例:http: //jsbin.com/apurac/4/edit

有关使用 jasmine 进行异步测试的提示,请参阅这篇文章:http: //blog.caplin.com/2012/01/17/testing-asynchronous-javascript-with-jasmine/

此外,请务必Ember.testing = true为所有测试设置。有关详细信息,请参阅此 SO 帖子:是否建议将 Ember.testing = true 设置为单元测试?

于 2013-01-20T07:34:45.127 回答