How to mock an Ember-CLI service in an acceptance test?

前端 未结 3 1339
北荒
北荒 2021-01-31 16:51

Quick summary/tldr:

  • It seems that Ember\'s container lookup process + Ember-CLI\'s module resolver doesn\'t allow manually un-registering a service and then regi
3条回答
  •  太阳男子
    2021-01-31 17:29

    The existing answers work well, but there's a way that avoids renaming the service and skips the inject.

    See https://github.com/ember-weekend/ember-weekend/blob/fb4a02353fbb033daefd258bbc032daf070d17bf/tests/helpers/module-for-acceptance.js#L14 and usage at https://github.com/ember-weekend/ember-weekend/blob/fb4a02353fbb033daefd258bbc032daf070d17bf/tests/acceptance/keyboard-shortcuts-test.js#L13

    I'll present it here as an update to the test helper I previously had here, so it's a drop-in replacement, but you may just want to follow the links above instead.

    // tests/helpers/override-service.js
    // Override a service with a mock/stub service.
    // Based on https://github.com/ember-weekend/ember-weekend/blob/fb4a02353fbb033daefd258bbc032daf070d17bf/tests/helpers/module-for-acceptance.js#L14
    // e.g. used at https://github.com/ember-weekend/ember-weekend/blob/fb4a02/tests/acceptance/keyboard-shortcuts-test.js#L13
    //
    // Parameters:
    // - newService is the mock object / service stub that will be injected
    // - serviceName is the object property being replaced,
    //     e.g. if you set 'redirector' on a controller you would access it with
    //     this.get('redirector')
    function(app, newService, serviceName) {
      const instance = app.__deprecatedInstance__;
      const registry = instance.register ? instance : instance.registry;
      return registry.register(`service:${serviceName}`, newService);
    }
    

    Plus performing the jslint and helper registration steps from https://guides.emberjs.com/v2.5.0/testing/acceptance/#toc_custom-test-helpers

    I can then call it like this, in my example stubbing out a redirect (window.location) service, which we want to do because redirecting breaks Testem:

    test("testing a redirect's path", function(assert) {
      const assertRedirectPerformed = assert.async();
      const redirectorMock = Ember.Service.extend({
        redirectTo(href) {
          assert.equal(href, '/neverwhere');
          assertRedirectPerformed();
        },
      });
    
      overrideService(redirectorMock, 'redirector');
      visit('/foo');
      click('#bar');
    });
    

提交回复
热议问题