Jest.js 请求作用域注入没有被嘲笑

ikfrs5lh  于 11个月前  发布在  Jest
关注(0)|答案(2)|浏览(121)

我试图模拟一个提供者的返回值,但由于某种原因,它正在清除模拟值。

Module1.ts

@Module({
  providers: [Service1],
  exports: [Service1],
})
export class Module1 {}

字符串

服务1.ts

@Injectable({
  scope: Scope.REQUEST,
})
export class Service1 {
  constructor() {
  }
  public getVal() {
    return '3';
  }
}

Service2.ts

@Injectable()
export class Service2 {
  constructor(private readonly service1: Service1) {}
  private someFn() {
    this.service1.getVal();
  }
}

Service2.test.ts

let service1;
let service2;
  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [Module1],
      providers: [Service2],
    }).compile();
    service2= await module.resolve(Service2);
    service1= await module.resolve(Service1);
  });
it('some test',()=> {
jest.spyOn(service1,'getVal').mockReturnValue('2'); //This should mock getVal function and return 2.
service2.someFn();
});


但是,模拟不会发生。我做错什么了吗?

von4xj4u

von4xj4u1#

service1.getVal不可能不被模仿,模仿非常简单。它不影响service2.someFn()意味着service2不使用与被模仿的Service1相同的示例。
正如the documentation所说:
请求
为每个传入的请求专门创建提供程序的新示例。在请求完成处理后,对该示例进行垃圾收集。
这意味着Service1示例是唯一的。属于Service2的示例需要被模仿:

jest.spyOn(service2['service1'], 'getVal').mockReturnValue('2')

字符串

doinxwow

doinxwow2#

每次对resolve的调用都会为限定作用域的提供程序“创建一个唯一的提供程序示例”。当运行这样的测试时,您需要创建一个contextId,以便所有内容都从同一个DI子树中取出。

beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [Module1],
      providers: [Service2],
    }).compile();
    const contextId = ContextIdFactory.create();
    service2 = await module.resolve(Service2, contextId);
    service1 = await module.resolve(Service1, contextId);
  });

字符串
https://docs.nestjs.com/fundamentals/module-ref#resolving-scoped-providers

相关问题