Jasmine 2.0 async done () и angular-mocks inject() в том же тесте()


мой обычный тестовый случай выглядит как

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

и Жасмин 2.0 асинхронный тест должен выглядеть как

it("should send get request", function(done) {
     someAsync.then(function(){
         done();
     });
});

Как я могу использовать как done, так и inject в одном тесте?

5 53

5 ответов:

Это должно работать; я столкнулся с той же проблемой, когда я обновился до 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
});

важным примечанием являются скобки после inject звонок. Например.

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

если вы посмотрите на типа inject:

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

вы можете видеть, что он возвращает функцию, так что вы не получали никакого вывода, потому что вы забыли вызвать функцию!!

если вы думаете об этом, имеет смысл, что он возвращает функцию, потому что it принимает функцию!

так что дополнительные скобки должны решить все проблемы!

рабочая Пример:

  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);
    })();
  });

добавить к ответу @Scott Boring и к комментарию @WhiteAngel, который упомянул, что код внутри inject никогда не вызывался.

это сработало для меня:

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

вы могли бы написать тест так:

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();
    }); 
}

для углового 5.2.0: @ scott-boring подход не работал для меня. То, что действительно работает, использует TestBed.get() чтобы получить услугу, вместо inject(), как описано в 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);
  });