Ember.js 使用Jasmine和DS.FixtureAdapter测试余烬数据

Ember.js 使用Jasmine和DS.FixtureAdapter测试余烬数据,ember.js,jasmine,ember-data,Ember.js,Jasmine,Ember Data,我正在尝试使用DS.FixtureAdapter对ember数据进行Jasmine测试(使用当前主数据)。我已经在下面的代码上尝试了几十种变体(无论是否尝试创建应用程序名称空间)。我还进入了ember数据源,尝试了解发生了什么,并引用了ember数据本身中的测试作为示例 我还尝试了Person.find(1)的变体,使用了Ember.run块和Jasmine wait() 无论我尝试什么,store.find(Person,'test')返回一个结果,但尝试获取其中一个属性的结果为null(测试

我正在尝试使用DS.FixtureAdapter对ember数据进行Jasmine测试(使用当前主数据)。我已经在下面的代码上尝试了几十种变体(无论是否尝试创建应用程序名称空间)。我还进入了ember数据源,尝试了解发生了什么,并引用了ember数据本身中的测试作为示例

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

无论我尝试什么,
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')
无论我尝试什么,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')
这是一个时间问题。调用
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不同,didLoad可以使用更多的黑盒测试方法,只需在调用find后100毫秒内验证名称是否正确设置,这当然会导致脆性测试 Ember.run.later(此函数为(){ log('should=kyle:',Em.get(kyle,'firstName'); 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 for working(非jasmine)示例:

有关使用jasmine进行异步测试的提示,请参阅本文:


另外,确保为所有测试设置
Ember.testing=true
。有关详细信息,请参阅本文:

谢谢,通过阅读您的答案和您发布的链接,我学到了很多。然而,每次我尝试使用
Ember.testing=true
,我都会遇到一个错误,我不得不使用Ember.run()(我就是这么做的!),不管怎样,我还是让它工作了。以下是我的结论: