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

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

joseville 3月前

100 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)
  • 我看到您使用了 \'subscribe\',这意味着 RxJS。您可以使用 lastValueFrom 函数将您的可观察对象转换为承诺。

    import { lastValueFrom } from 'rxjs'
    
    async GetAdditionalProducts() {
        return lastValueFrom(this.proposalService.getProductList(this.filter))
    }
    

    如果您想自己实现,您可以将您的 this.proposalService.getProductList(this.filter) 调用包装成一个承诺,然后在您的“订阅”回调中解决该承诺。

    您传递给 Promise 的任何内容都 resolve 将成为您的承诺的返回值,并且在使用 await 函数时可以访问。

     async GetAdditionalProducts() {
        return new Promise(resolve => {
          this.proposalService.getProductList(this.filter).subscribe(response => {
            resolve(response.productList);
          });
        })
      }
    
    

    然后,您可以致电 GetAdditionalProducts 并等待回复。

    async onSearch() {
      this.additionalProducts = await this.GetAdditionalProducts();
    }
    

    编辑:将可观察对象转换为承诺的新标准似乎是 lastValueFrom 。我已编辑了我的答案。感谢 Bojan 指出这一点。

返回
作者最近主题: