8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何使用 Jest+jest-auto-spies 监视公共领域

joseville 3月前

93 0

我有这个试图模拟的 Angular 服务:@Injectable({ providedIn: 'root',})export class NotificationsService { private _notifications = new Subject (); 民众

我正在尝试模拟这个 Angular 服务:

@Injectable({
  providedIn: 'root',
})
export class NotificationsService {
  private _notifications = new Subject<Notification>();
  public notifications: Observable<Notification> = this._notifications.asObservable();
  public crudNotifications: Observable<CrudNotification> = this._notifications.asObservable().pipe(
    filter(notification => notification.notificationType === 'crud-notification'),
    map(notification => notification as CrudNotification)
  );
//....
}

我刚刚将其迁移到 Jest,并试图弄清楚当我的测试服务尝试访问时如何模拟返回自定义可观察对象 NotificationsService.crudNotifications

目前,我有这个:

describe('OrganizationUsersService', () => {
  let organizationUsersService: OrganizationUsersService;
  let crudNotifications!: Subject<CrudNotification>;
  let notificationServiceMock!: Spy<NotificationsService>
  let storeMock!: Spy<Store>;
  let httpTestingController! :HttpTestingController;
  
  beforeEach(()=>{
    

    TestBed.configureTestingModule({
      providers:[
      {provide: NotificationsService, useValue: createSpyFromClass(NotificationsService)},
      {provide: Store, useValue:     createSpyFromClass(Store)  },
      {provide: Router, useValue:     createSpyFromClass(Router)  },
      provideHttpClient(),
      provideHttpClientTesting(),
      ]
    })
    httpTestingController = TestBed.inject(HttpTestingController);
    notificationServiceMock = TestBed.inject<any>(NotificationsService);
    storeMock = TestBed.inject<any>(Store);

    //Common mocked stuff behavior for every methods here    
    crudNotifications = new Subject<CrudNotification>();
    notificationServiceMock.crudNotifications = crudNotifications.asObservable();

    storeMock.dispatch.mockReturnValue(of());
    storeMock.select.mockReturnValue(of({ id: 'some-id' }));

    //Finally create the service to test:    
    organizationUsersService = TestBed.inject(OrganizationUsersService);
  })

    fit('should refresh the store when the backend inform a new role attribution has been added for the current organization id', fakeAsync(() => {
    //Arrange
    organizationUsersService.initialize(); //Required to register

    //Act
    crudNotifications.next({
      dataType: 'organization.role-attribution',
      operationType: 'add',
      id: 'some-id',
      notificationType: 'crud-notification',
    });
    tick();

    //Assert
    httpTestingController.expectOne(environment.backendUrl + 'some/stuff').flush({});
    httpTestingController.expectOne(environment.backendUrl + 'some/other/stuff').flush({});

    expect(storeMock.dispatch).toHaveBeenCalledWith(expect.any(SetLoadingAction));
    organizationUsersService.dispose();
  }));
}));

这不起作用,因为我尝试设置的可观察对象没有启用 Spy 方法。我尝试过这个:

notificationServiceMock.crudNotifications.mockReturnValue(crudNotifications);

但公共字段上不存在 mockReturnValue 方法。

有没有办法在公共领域模拟价值?

帖子版权声明 1、本帖标题:如何使用 Jest+jest-auto-spies 监视公共领域
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由joseville在本站《angular》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我无法理解在这种情况下如何使用 async/await。我有一个函数 GetAdditionalProducts(),它调用一个服务并返回一个结果。我在其他地方调用该函数...

    我无法理解在这种情况下如何使用 async/await。我有一个函数 GetAdditionalProducts() ,它调用一个服务并返回一个结果。我在需要访问该结果的其他地方调用了该函数,但它在响应可用之前执行了该代码。我如何使用 async/await 等待响应然后再继续?

      onSearch() {
        this.GetAdditionalProducts();
        //other stuff that requires the response from above function
      }   
    
      GetAdditionalProducts() {
        this.proposalService.getProductList(this.filter).subscribe(response => {
          this.additionalProducts = response.productList;
        });
      }
    
返回
作者最近主题: