我正在嘗試使用nestjs和jest測驗用例向資料庫添加實際值。
測驗用例的主要目的是實際檢查從資料庫中寫入和檢索的資料庫值。所以我沒有模擬任何save或find方法,因為我想與資料庫進行實際連接并從那里檢索記錄。因此,如果不模擬save()和find()方法,我就無法運行測驗案例。沒有它,編譯就會失敗。
我被困在users.service.spec.ts檔案中,我想使用UserDocument和它的方法create()、findAll()。
//user.entity.ts。
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'/span>;
import { Document } from 'mongoose'/span>;
export type UserDocument = User & Document;
@Schema()
export class User {
@Prop({ unique: true })
username: string;
@Prop()
年齡: 數字。
@Prop()
password: string;
}
export const UserSchema = SchemaFactory. createForClass(User)。
// User.module.ts
import { Module } from '@nestjs/common'/span>。
import { UsersService } from './users.service'/span>;
import { MongooseModule } from '@nestjs/mongoose'/span>
import { User, UserSchema } from './schemas/user.schema'
import { UsersController } from './users.controller'/span>;
@Module({
imports: [MongooseModule.forFeature([{ name。User.name, schema。UserSchema }])。
controllers: [UsersController]。
providers: [UsersService]。
出口。[UsersService]。
})
export class UsersModule {}。
// users.controller.ts
import { Controller, Get, Post, Body, Patch, Param, Delete,UseGuards } from '@nestjs/common'/span>。
import { UsersService } from './users.service'/span>;
import { CreateUserDto } from './dto/creat-user.dto'。
import { UpdateUserDto } from './dto/updateuser.dto' ;
@Controller(' users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Post()
create(@Body() createUserDto: CreateUserDto) {
return this.usersService.create(createUserDto)。
}
@Get()
findAll() {
return this.usersService.findAll()。
}
}
//users.service.ts
import { Injectable } from '@nestjs/common'/span>。
import { CreateUserDto } from './dto/create-user.dto'。
import { UpdateUserDto } from './dto/updateuser.dto' ;
import { User, UserDocument } from './schemas/user.schema'。
import { Model } from 'mongoose'/span>;
import { InjectModel } from '@nestjs/mongoose'/span>;
@Injectable()
export class UsersService {
constructor(@InjectModel(User.name) private userModel。Model<UserDocument>) {}
async create(createUserDto: CreateUserDto)。) Promise<User> {
const createdUser = new this.userModel(createUserDto)。
return await createdUser.save()。
}
async findAll(): Promise<User[]> {
return await this. userModel.find().exec() 。
}
//users.service.spec.ts。
import { Test, TestingModule } from '@nestjs/testing'
import { UsersService } from './users.service'
import { AppConfigModule } from './config/app-config.module'
import { AppConfigService } from '.../config/app-config.service'
import { ConfigModule, ConfigService } from '@nestjs/config' >。
import { MongooseModule, getModelToken } from '@nestjs/mongoose', getModelToken }。
import { PaginationQuery } from 'src/helpers/pagination/pagination-query.dto'
import { User, UserSchema, UserDocument } from './entities/user.entity'
describe('UsersService', () => {
let service: UsersServicelet userDocument: UserDocument: UserDocument.
beforeEach(async ( ) => {
const module: TestingModule = await Test.createTestingModule({
imports: [
ConfigModule.forRoot({
isGlobal: true,
cache: true。
}),
MongooseModule.forRootAsync({
imports: [AppConfigModule]。
inject。[AppConfigService]。
useFactory: (config: AppConfigService) => ({
uri: `mongodb://${config.TESTDATABASE_HOST}:${config.TESTDATABSE_PORT}`。
dbName: config.TESTDATABASE_NAME。
})
})
],
providers: [
UsersService,
{
provide: getModelToken(User.name)。
useValue: UserDocument // <----------- 不能夠理解什么會在這里。
}
]
}).compile()
service = module.get<UsersService> (UsersService)
userDocument = module. get<UserDocument>(UserDocument) //<---- 因為這里是不接受值的型別。
})
it('should be defined', () => {
expect(服務).toBeDefined()。
})
it('create test data', async ( ) => {
expect(
await service.create({
name: 'demouser',
email: '[email protected]',
password: 'demo@123',
角色。'user'toEqual({
statusCode: 201,
message: '用戶創建成功'。
data: {
isActive: true,
角色。'user'。
password:
'2b$10$VjwR0Wjf6vTaRjQlsizB5OLY04NJOcRyC/pPLbTPTQnWTDIrBU.Sq'/span>。
email: '[email protected]'。
name: 'demouser',
_id: expect.any(Number)
}
})
})
})
正如我在規范檔案中強調的,UserDocument是在users.entity.ts檔案中定義的型別,在userDocument = module.get<UserDocument>(UserDocument)行中不接受UserDocument這個值。
uj5u.com熱心網友回復:
userDocument = module.get<UserDocument>(UserDocument)必須是
userDocument = module.get<UserDocument>(getModelToken(User.name))
因為你想得到你為getModelToken(User.name)提供者定義的存根
在useValue: UserDocument中,你必須使用一些存根/模擬物件,比如這個。https://github.com/jmcdo29/testing-nestjs/blob/6c77b2a5001a48673c77c9659d985a083354579f/apps/sequelize-sample/src/cats/cats.service.spec.ts#L17-L20,因為你試圖不使用真實的模型。
uj5u.com熱心網友回復:
我解決了我的問題錯誤。
添加這個匯入,它解決了我的錯誤。
我可以將實際值添加到資料庫中
標籤:蒙哥馬利公司(Mongoose)是世界上最古老的公司之一。
MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]) //users.service.spec.ts
import { Test, TestingModule } from '@nestjs/testing'
import { UsersService } from './users.service'
import { AppConfigModule } from './config/app-config.module'
import { AppConfigService } from '.../config/app-config.service'
import { ConfigModule } from '@nestjs/config'/span>
import { MongooseModule, getModelToken } from '@nestjs/mongoose', getModelToken }。
import { User, UserSchema } from './entities/user.entity'
import { isValidObjectId } from 'mongoose'/span>
import { HttpException } from '@nestjs/common'/span>
const testUser = {
name: 'demouser',
email: '[email protected]',
password: 'demo@123',
角色。'user'describe('UsersService', ( ) => {
let service: UsersServicebeforeEach(async ( ) => {
const module: TestingModule = await Test.createTestingModule({
imports: [
ConfigModule.forRoot({
isGlobal: true,
cache: true。
}),
MongooseModule.forRootAsync({
imports: [AppConfigModule]。
inject。[AppConfigService]。
useFactory: (config: AppConfigService) => ({
uri: `mongodb://${config.TESTDATABASE_HOST}:${config.TESTDATABSE_PORT}`。
dbName: config.TESTDATABASE_NAME。
})
}),
MongooseModule.forFeature([{ name: User.name, schema。UserSchema }])//-------import model here。
],
providers: [UsersService] 。
}).compile()
service = module.get<UsersService> (UsersService)
})
it('should be defined', () => {
expect(服務).toBeDefined()。
})
})
