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

前端 未结 3 1331
北荒
北荒 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:13

    Short version of the solution: your registered mock service must have a different service:name than the "real" service you're trying to mock.

    Acceptance test:

    import Ember from 'ember';
    import { module, test } from 'qunit';
    import startApp from 'container-doubling/tests/helpers/start-app';
    
    var application;
    
    let speakerMock = Ember.Service.extend({
      speak: function() {
        console.log("Acceptance Mock!");
      }
    });
    
    module('Acceptance | acceptance demo', {
      beforeEach: function() {
        application = startApp();
    
        // the key here is that the registered service:name IS NOT the same as the real service you're trying to mock
        // if you inject it as the same service:name, then the real one will take precedence and be loaded
        application.register('service:mockSpeaker', speakerMock);
    
        // this should look like your non-test injection, but with the service:name being that of the mock.
        // this will make speakerService use your mock
        application.inject('component', 'speakerService', 'service:mockSpeaker');
      },
    
      afterEach: function() {
        Ember.run(application, 'destroy');
      }
    });
    
    test('visit a route that will trigger usage of the mock service' , function(assert) {
      visit('/');
    
      andThen(function() {
        assert.equal(currentURL(), '/');
      });
    });
    

    Integration test (this is what I was originally working on that caused me issues)

    import { moduleForComponent, test } from 'ember-qunit';
    import hbs from 'htmlbars-inline-precompile';
    import Ember from 'ember';
    
    
    let speakerMock = Ember.Service.extend({
      speak: function() {
        console.log("Mock one!");
      }
    });
    
    moduleForComponent('component-one', 'Integration | Component | component one', {
      integration: true,
    
      beforeEach: function() {
        // ember 1.13
        this.container.register('service:mockspeaker', speakerMock);
        this.container.injection('component', 'speakerService', 'service:mockspeaker');
    
        // ember 2.1
        //this.container.registry.register('service:mockspeaker', speakerMock);
        //this.container.registry.injection('component', 'speakerService', 'service:mockspeaker');
      }
    });
    
    test('it renders', function(assert) {
      assert.expect(1);
    
      this.render(hbs`{{component-one}}`);
    
      assert.ok(true);
    });
    

提交回复
热议问题