我有一个简单的 route 在我的应用程序像这样:

Dash.PostsNewRoute = Em.Route.extend({
  model: function() {
    return this.store.createRecord('post');
  },

  actions: {
    saveForm: function() {
      this.modelFor('postsNew').save();
    }
  }
});

这是我写的测试 saveForm 并确保它被调用:

...
context('create new post', function() {
  beforeEach(function() {
    ...
  });

  it('calls submit on route', function() {
    var mock;
    mock = sinon.mock(testHelper.lookup('route', 'posts.new'));
    mock.expects('actions.saveForm').once();

    this.submitButton.click();

    mock.verify();
    mock.restore();
  });
});

但是,我得到一个错误与此实现:Attempted to wrap undefined property actions.saveForm as function

如果我改变路线,它是这样的测试,它会工作:

// Moving the save out of action and call it
Dash.PostsNewRoute = Em.Route.extend({
  model: function() {
    this.store.createRecord('post');
  },

  save: function() {
    this.modelFor('postsNew').save()
  },

  actions: {
    saveForm: function() {
      this.save();
    }
  }
});

新的测试:

  it('calls submit on route', function() {
    var mock;
    mock = sinon.mock(testHelper.lookup('route', 'posts.new'));
    mock.expects('save').once();

    this.submitButton.click();

    mock.verify();
    mock.restore();
  });

这样测试就会通过。是否有可能测试 actions.saveForm 直接?是sinon的限制,阻止我访问动作。保存形式?

有帮助吗?

解决方案

你可以模拟动作哈希并像这样设置期望:

mock = sinon.mock(testHelper.lookup('controller', 'posts_new')._actions);
mock.expects('save').once();

this.submitButton.click();

mock.verify();
mock.restore();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top