سؤال

لدي بسيطة 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 مباشرة؟هل محدودية سينون هي التي تمنعني من الوصول إلى action.saveForm؟

هل كانت مفيدة؟

المحلول

يمكنك الاستهزاء بتجزئة الإجراءات وتحديد التوقعات لها كما يلي:

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