我已经创建了一个存储,以在行为主体中加载地址详细信息

@Injectable({
    providedIn: 'root'
})
export class AddressStore {
    private subjectAddress = new BehaviorSubject<Address[]>([]);
    address$: Observable<Address[]> = this.subjectAddress.asObservable();

    constructor(private addressService: AddressService){
        this.loadAddress();
    }

    private loadAddress(){
        this.addressService.getAddressByType('HOME')
            .subscribe((state => this.subjectAddress.next(state)));
    }
}

我需要模拟单元测试用例中的地址服务返回的数据,但它返回undefined错误:

describe('Address Data Store', () => {
    let addressServiceSpy = jasmine.createSpyObj('AddressService', [
        'getAddressByType',
    ]);
    let addressService: any;
    let addressStore: AddressStore;

    let mockAddress = [
        {
          type: "HOME",
          houseNumber: "101",
          address: "xyz"
        }
    ];

    beforeEach(() => { 
        TestBed.configureTestingModule({
            imports: [
              RouterTestingModule,
              HttpClientTestingModule
            ],
            providers: [
              {
                provide: AddressService,
                useValue: addressServiceSpy
              },
              AddressStore
            ],
        });
        addressService = TestBed.inject(AddressService);
        addressStore = TestBed.inject(AddressStore);
    });

    it('should be created', fakeAsync(() => {
        addressService.getAddressByType.and.returnValue(of(mockAddress));
        expect(addressStore).toBeTruthy();
        flush();
    }));
})

如何在为存储编写单元测试用例的同时模拟服务订阅数据.

推荐答案

AddressStore在调用loadAddress期间调用构造函数内的AddressService.然而,当你在测试中注入AddressStore时,你并没有模拟getAddressByType方法的返回值,因此它不会返回一个可以订阅的观察值.在注入AddressStore之前,必须为getAddressByType方法mock定义一个返回值.

Example:

describe('Address Data Store', () => {
  let addressServiceSpy = jasmine.createSpyObj('AddressService', [
    'getAddressByType',
  ]);
  let addressService: any;
  let addressStore: AddressStore;

  let mockAddress = [
    {
      type: "HOME",
      houseNumber: "101",
      address: "xyz"
    }
  ];

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        RouterTestingModule,
        HttpClientTestingModule
      ],
      providers: [
        {
          provide: AddressService,
          useValue: addressServiceSpy
        },
        AddressStore
      ],
    });
    addressService = TestBed.inject(AddressService);
    addressService.getAddressByType.and.returnValue(of(mockAddress));

    addressStore = TestBed.inject(AddressStore);
  });

  it('should be created', fakeAsync(() => {
    addressService.getAddressByType.and.returnValue(of(mockAddress));
    expect(addressStore).toBeTruthy();
    flush();
  }));
});

Angular相关问答推荐

导入浏览器模块时出错已导入commonModule的insted,animationBrower也显示错误,当p打开时

Angular 升级到v16和Ant设计错误:';nzComponentParams';类型';ModalOptions';中不存在

使用当前选定的选项创建IF语句

如何动态呈现组件并以Angular 访问它们的方法?

首期日历发行

Angular router-outlet 未渲染

筛选器不会从文本输入触发更改事件

如何防止打印后的空格后的HTML元素的Angular ?

Angular NG5002错误无效的ICU消息和意外字符EOF

使用 Electron 打包器打包 Electron Angular 应用程序时无法加载资源

如果observableA在1秒前触发,则过滤掉observableB

URL 更改但组件未在 Angular 导航中呈现

Angular 按钮指令错误地附加子元素

根据最后发出的 observable 创建一个 observable

显示 1 个数据而不是所有 ngFor - Angular 11

URL 清理导致嵌入式 YouTube 视频的刷新

Failed to execute 'setAttribute' on 'Element': ']' is not a valid attribute name

Angular 4中的md-select中的onselected事件

在Angular2 Dart中设置路由和RouterLink的正确方法是什么

如何防止角material垫菜单关闭?