Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js overrideProvider(令牌)在Test.createTestingModule的nestJS中不工作_Node.js_Unit Testing_Node Modules_Code Injection_Nestjs - Fatal编程技术网

Node.js overrideProvider(令牌)在Test.createTestingModule的nestJS中不工作

Node.js overrideProvider(令牌)在Test.createTestingModule的nestJS中不工作,node.js,unit-testing,node-modules,code-injection,nestjs,Node.js,Unit Testing,Node Modules,Code Injection,Nestjs,我在测试上下文中重写提供程序时遇到问题。我知道我漏掉了一些显而易见的东西,但我尝试了大量的排列,但没有一个有效,所以我要把这个告诉蜂群 我的结构如下: 共享的.module.ts @Module({ providers: [ DatabaseProvider, ConfigService, CacheService ], exports: [ DatabaseProvider, ConfigS

我在测试上下文中重写提供程序时遇到问题。我知道我漏掉了一些显而易见的东西,但我尝试了大量的排列,但没有一个有效,所以我要把这个告诉蜂群

我的结构如下:

共享的.module.ts

@Module({
    providers: [
        DatabaseProvider,
        ConfigService,
        CacheService
    ],
    exports: [
        DatabaseProvider,
        ConfigService
        CacheService
    ],
    imports: [HttpModule],
})
@Module({
    imports: [SharedModule, HttpModule],
    exports: [MyService],
    controllers: [MyController],
    providers: [MyService],
})
@Module({
    imports: [
        SharedModule,
        MyModule
    ],
    providers: [
        ...
    ],
    controllers: [
        ...
    ]
})
export class MyService {
    constructor(
        @Inject("MongoConnection") private readonly dbConnection: Connection,
        private _cache: CacheService
    ) { }
...
}
let cacheService = {...};
this.db = {...};

const module = await Test.createTestingModule({
        imports: [SharedModule, MyModule, HttpModule]
    })
    .overrideProvider(CacheService)
    .useValue(cacheService)
    .overrideProvider("MongoConnection")
    .useValue(this.db)
    .compile();
其中,DatabaseProvider定义为:

const DatabaseProvider = {
    provide: "MongoConnection",
    inject: [ConfigService],
    useFactory: async (config: ConfigService): Promise < typeof mongoose | Object > => {
        return await mongoose.connect(config.getString("MONGO_URI"), { useNewUrlParser: true });
    }
};
应用程序模块.ts

@Module({
    providers: [
        DatabaseProvider,
        ConfigService,
        CacheService
    ],
    exports: [
        DatabaseProvider,
        ConfigService
        CacheService
    ],
    imports: [HttpModule],
})
@Module({
    imports: [SharedModule, HttpModule],
    exports: [MyService],
    controllers: [MyController],
    providers: [MyService],
})
@Module({
    imports: [
        SharedModule,
        MyModule
    ],
    providers: [
        ...
    ],
    controllers: [
        ...
    ]
})
export class MyService {
    constructor(
        @Inject("MongoConnection") private readonly dbConnection: Connection,
        private _cache: CacheService
    ) { }
...
}
let cacheService = {...};
this.db = {...};

const module = await Test.createTestingModule({
        imports: [SharedModule, MyModule, HttpModule]
    })
    .overrideProvider(CacheService)
    .useValue(cacheService)
    .overrideProvider("MongoConnection")
    .useValue(this.db)
    .compile();
my.service.ts

@Module({
    providers: [
        DatabaseProvider,
        ConfigService,
        CacheService
    ],
    exports: [
        DatabaseProvider,
        ConfigService
        CacheService
    ],
    imports: [HttpModule],
})
@Module({
    imports: [SharedModule, HttpModule],
    exports: [MyService],
    controllers: [MyController],
    providers: [MyService],
})
@Module({
    imports: [
        SharedModule,
        MyModule
    ],
    providers: [
        ...
    ],
    controllers: [
        ...
    ]
})
export class MyService {
    constructor(
        @Inject("MongoConnection") private readonly dbConnection: Connection,
        private _cache: CacheService
    ) { }
...
}
let cacheService = {...};
this.db = {...};

const module = await Test.createTestingModule({
        imports: [SharedModule, MyModule, HttpModule]
    })
    .overrideProvider(CacheService)
    .useValue(cacheService)
    .overrideProvider("MongoConnection")
    .useValue(this.db)
    .compile();
my.spec.ts

@Module({
    providers: [
        DatabaseProvider,
        ConfigService,
        CacheService
    ],
    exports: [
        DatabaseProvider,
        ConfigService
        CacheService
    ],
    imports: [HttpModule],
})
@Module({
    imports: [SharedModule, HttpModule],
    exports: [MyService],
    controllers: [MyController],
    providers: [MyService],
})
@Module({
    imports: [
        SharedModule,
        MyModule
    ],
    providers: [
        ...
    ],
    controllers: [
        ...
    ]
})
export class MyService {
    constructor(
        @Inject("MongoConnection") private readonly dbConnection: Connection,
        private _cache: CacheService
    ) { }
...
}
let cacheService = {...};
this.db = {...};

const module = await Test.createTestingModule({
        imports: [SharedModule, MyModule, HttpModule]
    })
    .overrideProvider(CacheService)
    .useValue(cacheService)
    .overrideProvider("MongoConnection")
    .useValue(this.db)
    .compile();
我的问题是CacheService似乎被覆盖(它使用CacheService中定义的redis mock,而不是CacheService中的默认redis实现),但MongoConnection没有被覆盖-它仍在从shared.module.ts调用原始DatabaseProvider


有人能指出我遗漏了什么吗?

你真的用
@injection()
而不是
@InjectConnection()
来注入连接吗?啊,你不是在用
@nestjs/mongoose
,对吗?有人反对使用这个软件包吗?