Angular Jasmine 测试继续之前的测试

问题描述 投票:0回答:1

我有一个名为

items
的服务,这是
spec
文件:

import { TestBed } from '@angular/core/testing';

import { ItemsService } from './items.service';

describe('ItemsListService', () => {
  let service: ItemsService;

  beforeEach(() => {
    TestBed.configureTestingModule({});
    service = TestBed.inject(ItemsService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  it('should insert new item', () => {
    const item = {
      id: '123',
      name: 'item',
      baseUnit: 'unit',
      brand: 'brand',
      price: 100,
      quantity: 10,
      supplier: 'supplier',
      cost: 50,
      imageUrl: 'url',
    };
    service.insertItem(item);
    const items = service.getItems();
    expect(items.length).toBeGreaterThan(0);
    expect(items).toContain(item);
  });
});

这是另一个名为

orders
的服务,它依赖于
items
服务从存储的商品创建订单。

import { TestBed } from '@angular/core/testing';

import { OrdersService } from './orders.service';

describe('OrdersService', () => {
  let service: OrdersService;

  beforeEach(() => {
    TestBed.configureTestingModule({});
    service = TestBed.inject(OrdersService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  it('should insert new order', async () => {
    const newOrder = await service.insertOrder(itemsService.getItems()[0]);
  });
});

因此,为了让

orders
服务创建新订单,它需要访问存储在
items
服务中的项目
service.insertOrder(itemsService.getItems()[0])

如何访问在

items
文件中创建的
spec
服务的同一实例?

javascript angular jasmine karma-jasmine
1个回答
0
投票

您希望在 OrdersService Spec 中重用 ItemsService 的同一实例,该实例已从 ItemsService Spec 添加了项目,而无需在 OrdersService Spec 中再次添加项目。

要实现此目标,您需要确保 OrdersService Spec 中的 ItemsService 反映 ItemsService Spec 文件中的 ItemsService 的状态(其中已添加项目)。

由于 TestBed 默认情况下为每个规范创建一个新的服务实例,因此您无法直接在不同的规范文件之间共享该实例,除非您 将设置合并到同一个测试套件中 按顺序运行测试。

import { TestBed } from '@angular/core/testing';
import { OrdersService } from './orders.service.ts';
import { ItemsService } from './items.service.ts';

let ordersService: OrdersService;
let itemsService: ItemsService;

beforeEach(() => {
  TestBed.configureTestingModule({
    providers: [OrdersService, ItemsService]
  })

  ordersService = TestBed.inject(OrdersService);
  itemsService = TestBed.inject(ItemsService);

  const item = {...your object...}

  itemsService.insertItem(item);
})

it('should insert new order using existing item from ItemsService', async () => {
  const newOrder = await ordersService.insertOrder(itemsService.getItems()[0])
  -- rest of your test case code --
}) 
})
© www.soinside.com 2019 - 2024. All rights reserved.