Jasmine 2.0 async done() and angular-mocks inject() in same test it()

后端 未结 5 1355
伪装坚强ぢ
伪装坚强ぢ 2020-12-08 18:11

My usual test case looks like

it(\"should send get request\", inject(function(someServices) {
     //some test
}));

And Jasmine 2.0 async

相关标签:
5条回答
  • 2020-12-08 18:36

    To add to the answer of @Scott Boring and to the comment of @WhiteAngel who mentionned that the code inside inject was never called.

    This worked for me:

    it("should send get request", function(done) {
        inject(function(someServices) {
           //some async test
           done();
        })();
    });
    
    0 讨论(0)
  • 2020-12-08 18:37

    An IMPORTANT note is the brackets after the inject call. Eg.

    inject(function(someServices) {
       //some async test
       done();
    })();  <-- these brackets here important.
    

    If you look at the type of inject:

    export declare function inject(tokens: any[], fn: Function): () => any;
    

    You can see it returns a function, so you were getting no output because you forgot to call the function!!

    If you think about it, it makes sense that it returns a function, because it takes a function!

    So the extra parentheses should solve all problem!

    Working Example:

      it('should allow you to observe for changes', function(done) {
        inject([GlobalStateService], (globalStateService: GlobalStateService) => {
          globalStateService.observe("user", storageType.InMemoryStorage, (user: string) => {
            expect(user).toBe("bla");
            done();
          });
    
          globalStateService.write({ user: "bla"}, storageType.InMemoryStorage);
        })();
      });
    
    0 讨论(0)
  • 2020-12-08 18:39

    This should work; I ran into the same problem when I updated to Jasmine 2.0

    it("should send get request", function(done) {
        inject(function(someServices) {
            //some async test
            done();
        })(); // function returned by 'inject' has to be invoked
    });
    
    0 讨论(0)
  • 2020-12-08 18:42

    You could write the test like that:

    describe("Some service'", function () {    
        var service;
        var data;
    
        beforeEach(function (done) {   
    
            module('app');
    
            inject(function (someService) {
                service = someService;
            });
    
            service
                .getData()
                .then(function(result) {
                    data = result;
                    done();
                });
        }); 
    
        it('should return a result', function () {  
            expect(data).toBeDefined();
        }); 
    }
    
    0 讨论(0)
  • 2020-12-08 18:44

    For Angular 5.2.0: @scott-boring's approach did not work for me. What did work is using the TestBed.get() to get the services instead of inject(), as described in the docs:

    describe('TooltipComponent', () => {
      let component: TooltipComponent;
      let fixture: ComponentFixture<TooltipComponent>;
      let myService: MyService;
    
      beforeEach(async(() => {
        const myServiceSpy = jasmine.createSpyObj('MyService', ['calc']);
    
        TestBed.configureTestingModule({
          declarations: [ MyComponent ],
          providers: [
            {provide: MyService, useValue: myServiceSpy}
          ]
        })
        .compileComponents();
    
        myService = TestBed.get(MyService);
      }));
    
      beforeEach(() => {
        fixture = TestBed.createComponent(MyComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();
      });
    
      it('should render correctly', (done) => {
        component.render();
    
        setTimeout(() => {
          expect(myService.calc).toHaveBeenCalled();
          done();
        }, 1000);
      });
    
    0 讨论(0)
提交回复
热议问题