【问题标题】:Integration test not rendering after click when observing ember data record观察ember数据记录时点击后集成测试不渲染
【发布时间】:2020-03-26 20:50:43
【问题描述】:

我似乎无法弄清楚为什么一个非常简单的集成测试没有通过

给定一个 ember 数据模型setting.js

export default class SettingModel extends Model {
  @attr('string') name;
  @attr('number') value;
}

我正在用一个组件渲染这个模型

<MyComponent @setting={{setting}}
             @name={{setting.name}}
             @value={{setting.value}}
             @values={{array 0 1 2}}
             @saveSetting={{saveSetting}} />

组件呈现所有可能的值 (@values) 并在等于当前值的那个上应用 active

{{#each @values as |value|}}
  <div class="btn {{if (eq @value value) "active"}}" {{on "click" (fn @saveSetting @setting value)}}>
    {{value}}
  </div>
{{/each}}

我想写一个简单的测试,点击另一个按钮更新活动类,但最后一个断言总是失败。活动类永远不会更新。在这个例子中,我使用了 ember-cli mirage

  test('updates new saved value', async function(assert) {
    this.server.get('/settings/:id', () => ({ settings: { id: 1, name: "settingName", value: 1 }}), 200);
    let setting = await this.owner.lookup('service:store').findRecord('setting', 1);
    this.set('setting', setting);
    this.set('name', setting.get('name'));
    this.set('value', setting.get('value'));
    this.set('values', [0, 1, 2]);
    this.set('saveSettingFn', (setting, newValue) => {
      setting.set('value', newValue);
      setting.save().then(() => console.log('also saved!'));
      console.log('saved!');
    });

    await render(hbs`<MyComponent @setting={{this.setting}}
                                  @name={{this.name}}
                                  @value={{this.value}}
                                  @values={{this.values}}
                                  @saveSetting={{this.saveSettingFn}} />`);

    // middle option active
    assert.ok(this.element.querySelectorAll('.btn')[1].getAttribute('class').includes('active'), 'second button active');
    // set up save handler
    this.server.put('/settings/:id', () => ({ settings: { id: 1, name: "settingName", value: 1 }}), 200);
    // click the first button
    await click('.btn');
    // first option active
    assert.ok(this.element.querySelectorAll('.btn')[0].getAttribute('class').includes('active'), 'first button active');

我在这里创建了一个测试失败的示例项目 https://github.com/spicalous/component-test-example/blob/master/tests/integration/components/my-component-test.js#L55

  1. 模型上的值似乎已保存
  2. 我尝试过使用waitFor 测试助手
  3. 我试过await settled();

感谢任何帮助!谢谢!

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案1】:

    你的saveSettingFn 函数什么都不做。所以什么都没有发生。

    【讨论】:

    • 抱歉!我已经更正了问题中的示例和示例 repo!
    • 仍然,你没有做任何合理的事情。 setting.set('value', newValue); 不会影响 DOM,因为您不在 DOM 中使用 @setting。对于active 类,您将@values 数组的元素与@value 进行比较,两者都与@setting 无关。
    • 我正在调用 save 函数,那应该发出服务器请求来保存 ember 记录对吗?我正在执行以下操作:``` setting.set('value', newValue);设置.保存(); ``` 另外,@value === setting.value (1) value 是可能的值,用户可以选择(0, 1, 2) 所以测试应该更新,因为设置值已经改变了
    • 但是 @value 在你的测试中不是 @setting.value. 它是 this.value 并且你永远不会改变它。在您的测试中,@value={{this.value}} 也是如此。将其更改为@value={{this.setting.value}}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2015-05-16
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多