Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ';这';仅在组件集成测试中未定义_Javascript_Ember.js_Qunit_Ember Cli Mirage - Fatal编程技术网

Javascript ';这';仅在组件集成测试中未定义

Javascript ';这';仅在组件集成测试中未定义,javascript,ember.js,qunit,ember-cli-mirage,Javascript,Ember.js,Qunit,Ember Cli Mirage,这是一个余烬组件,在某些情况下需要此: export default Component.extend({ filteredSubs: computed.filter('model.subs', function() { // this will always return true in development http://localhost:4200/dummy // but will always return false in test because 'this'

这是一个余烬组件,在某些情况下需要

export default Component.extend({
  filteredSubs: computed.filter('model.subs', function() {
    // this will always return true in development http://localhost:4200/dummy
    // but will always return false in test because 'this' becomes undefined
    return this;
  })
});
Dummy
Sub
有一对多关系:

export default Model.extend({
  subs: hasMany('sub')
});

export default Model.extend({
  dummy: belongsTo('dummy')
});
此测试失败,但不应:

test('it renders', function(assert) {
  let dummy = server.create('dummy');
  server.create('sub', { dummy });

  this.set('dummy', dummy);
  this.render(hbs`{{show-dummy model=dummy}}`);

  assert.equal(this.$().text().trim(), 'Hi! There are 1 sub-dummies');
});
不正常13 Chrome 63.0-集成|组件|显示虚拟:它渲染

嗨!有0个子假人

期待:嗨!有1个子假人

  • 不确定这是否是一个余烬bug或余烬cli幻影bug
  • 我在一份新的回购协议中孤立了这个问题
  • 也张贴在

    • 你的问题来自一系列令人遗憾的错误假设

      您的第一个假设是
      Ember.computed.filter中的
      this
      应该是相应的对象。我不能100%肯定这是有记录的行为,我个人也不会相信它。如果您需要完全访问
      ,我将使用一个简单的
      Ember.computed

      然而,你的主要错误在于你的测试。这也解释了为什么你只在测试中遇到这个问题。您可以直接使用幻影模型作为组件的
      模型

      let dummy = server.create('dummy');
      server.create('sub', {
        dummy
      });
      
      this.set('dummy', dummy);
      
      this.render(hbs`{{show-dummy model=dummy}}`);
      
      在这里,您假设幻影模型
      server.create
      的结果在某些方面类似于
      ember data
      模型。不是!事实上,海市蜃楼模型甚至不是一个
      ember
      对象!因此,您不能在其上使用
      .get
      .set
      ,或在模型上定义的任何内容,并且绝对不应将其用作模型für组件测试。相反,您应该使用幻影作为
      ember数据
      模型的数据源

      如果您的模型是幻影模型,那么为什么
      未定义的问题会导致:


      其中,
      -上下文丢失。基本上,mirage在其自定义的类似数组的结构上覆盖了
      .filter
      函数,但不能确保保持
      这个
      -上下文。

      谢谢@Lux。我现在使用的是
      filteredSubs:computed('dummy.subs',function(){返回this.get('dummy.subs')。filter(s=>s);})
      .filter
      是否应保留
      的上下文现在正在讨论ember cli mirage问题@Lux您建议在组件测试中“伪造”数据是什么?大多数人使用海市蜃楼的
      服务器。创建
      ,但我不得不承认,它有时行为怪异,正如你提到的,我们并不总能访问
      .get
      .set
      。泰!我认为这并不常见
      server.create
      是生成测试数据的常用方法,但您应该始终使用真实的余烬数据模型来包装它们<代码>存储。推送
      可能是您要找的。您是对的。与Mirage的
      服务器相比,我发现这是在组件集成测试中“模拟对象”的最佳方式。create
      或Ember的
      EmberObject。create
      不适用于包含关系的对象
      filter(f) {
        let filteredModels = this.models.filter(f);
      
        return new Collection(this.modelName, filteredModels);
      }