Tìm kiếm trang web

kiểm thử đơn vị - Jasmine route spy - undefined không phải là một đối tượng (đang đánh giá 'navigate.calls.mostRecent().args')


Tôi đang cố gắng viết kiểm thử đơn vị cho một component Angular2 sử dụng định tuyến. Tôi có:

class MockRouter {
}

class MockAuth {
  isLoggedIn(){
    return false;
  }
}

describe('Home', () => {
  beforeEach(() => TestBed.configureTestingModule({
    providers: [
      BaseRequestOptions,
      { provide: Router, useClass: MockRouter },
      HomeComponent,
      { provide: AuthenticationService, useClass: MockAuth }
    ]
  }));

  it('should navigate to login', inject([HomeComponent], (home: HomeComponent) => {
    let navigate = jasmine.createSpy('navigate');
    expect(navigate.calls.mostRecent().args[0]).toEqual(['/login']);
  }));
});

nhưng tôi đang gặp lỗi:

TypeError: undefined không phải là một đối tượng (đang đánh giá 'navigate.calls.mostRecent().args') trong config/spec-bundle.js (dòng 41757)

Tôi nghĩ rằng jasmine spy là phương pháp đúng, nhưng tôi đã bỏ lỡ điều gì đó - Tôi đang làm gì sai?

Câu trả lời #1

Bạn nên thêm spy vào lớp MockRouter. Như vậy spy sẽ theo dõi các lần gọi navigate trong Router

class MockRouter {
  navigate = jasmine.createSpy('navigate');
}

describe('Home', () => {
  let mockRouter;
  let fixture;
  let component: HomeComponent;

  beforeEach(() => {
     mockRouter = new MockRouter();
     TestBed.configureTestingModule({
        declarations: [ HomeComponent ]
        providers: [
          BaseRequestOptions,
          { provide: Router, useValue: mockRouter },
          { provide: AuthenticationService, useClass: MockAuth }
        ]
      });
      fixture = TestBed.createComponent(HomeComponent);
      component = fixture.createComponent;
  });

  it('should navigate to login', () => {
    // calls component.ngOnInit
    fixture.detectChanges();

    // assuming some navigation has been done
    expect(mockRouter.navigate).toHaveBeenCalledWith(['/login']);
  });
});

Thông báo :

  • HomeComponent nằm trong declarations, không phải trong providers
  • Chúng tôi giữ một tham chiếu đến mock trong bài kiểm tra, và sử dụng useValue thay vì useClass khi chúng tôi cấu hình nó