【问题标题】:Mocking controllerFor in qunit tests.在 qunit 测试中模拟控制器。
【发布时间】:2016-06-04 00:36:11
【问题描述】:

我有一个 mixin 可以帮助我完成工作流程中的步骤。基本上,它查看当前步骤是什么,然后基于此执行一些魔术。问题是函数的第一行抓取了this.controllerFor('document'),我不明白如何模拟controllerFor 调用。例如,我知道我可以在测试中将{testing: "123"} 传递给.create。这会给我this.get('testing'),但我如何模拟controllerFor?另外,需要明确的是,controllerFor 调用的唯一原因是我可以获得currentStep

prepare-next.js

setNext: function() {
    let currentStep = this.controllerFor('document').get('currentStep');

    if (currentStep === 'First_step') {
        //do something
    } else {
        //do something else...
    }
    // Bunch more stuff happens...
}

prepare-next-test.js

import Ember from 'ember';
import PrepareNext from 'my-app/mixins/prepare-next';
import { module, test } from 'qunit';

module('mixin:prepare-next');

const PrepareNextObject = Ember.Object.extend(PrepareNext);
let subject;


test('#setNext does all the things', function(assert) {
  subject = PrepareNextObject.create();
  subject.setNext();
  //assert.equal(foo, bar);
});

【问题讨论】:

  • 你想做出什么样的断言?如果您只是断言使用特定参数调用给定函数,则可以使用 sinon.js。否则,我发现验收测试是对这类事情更合适的测试级别。

标签: javascript unit-testing ember.js qunit ember-qunit


【解决方案1】:

您可以在测试之前或测试中替换controllerFor方法:

import Ember from 'ember';
import PrepareNext from '../../../mixins/prepare-next';
import { module, test } from 'qunit';

module('mixin:prepare-next');

const PrepareNextObject = Ember.Object.extend(PrepareNext);

let subject;

test('#setNext does all the things', function(assert) {
  assert.expect(2);

  subject = PrepareNextObject.create();
  subject.controllerFor = () => {
    assert.ok(true, 'controllerFor called');
    return {
      get() {
        assert.ok(true, 'Get called');
        return 'First_step';
      }
    }
  };
  subject.setNext();
  //assert.equal(foo, bar);
});

Working demo.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    相关资源
    最近更新 更多