У меня есть служба, которая выполняет запрос к Mongodb и Neo4j. Метод создания запускает два метода: «CreateUserInMongoDB» и «CreateUserInNeo4j». Код приведен ниже:
export class UserService {
constructor(
@InjectModel('User') private readonly userModel: Model<UserDocument>,
@InjectModel('SportEvent')
private readonly sportEventModel: Model<SportEventDocument>,
private readonly neo4jQueryService: Neo4jQueryService
) {}
//creating a user.
async create(user: User): Promise<object> {
let userInMongoDB: { mongoId: string; firstName: string };
try {
userInMongoDB = await this.createUserInMongoDB(user);
const userIncreaeNeo4j = await this.createUserInNeo4j(
userInMongoDB.firstName,
userInMongoDB.mongoId
);
if (userIncreaeNeo4j && userInMongoDB) {
return {
statusCode: 201,
message: `User succesfully created`,
};
}
} catch (error) {
if (userInMongoDB) {
await this.userModel.findByIdAndDelete(userInMongoDB.mongoId).lean();
}
throw new HttpException(error.message, 400);
}
}
//create user in mongoDB
async createUserInMongoDB(
user: User
): Promise<{ mongoId: string; firstName: string }> {
try {
const createdUser = new this.userModel(user);
createdUser.email = user.email.toLowerCase();
createdUser.firstName = user.firstName.toLowerCase();
createdUser.lastName = user.lastName.toLowerCase();
console.info(user);
await createdUser.save();
const userInMongoDB = {
mongoId: createdUser._id.toString(),
firstName: createdUser.firstName,
};
return userInMongoDB;
} catch (error) {
if (error.code === 11000) {
throw new HttpException(
'Duplicate entry, email has to be unique.',
409
);
} else {
throw new HttpException(error.message, 400);
}
}
}
//create user in neo4j
async createUserInNeo4j(userName: string, userId: string): Promise<boolean> {
try {
await this.neo4jQueryService.write(
`CREATE (n:User {mongoId: "${userId}", name: "${userName}"}) RETURN n`
);
return true;
} catch (error) {
throw new HttpException(error.message, 400);
}
}
Я пытаюсь проверить код выше. Тест, который я пытаюсь сделать, прост, я просто хочу проверить, определен ли userService:
import { Test, TestingModule } from '@nestjs/testing';
import { getModelToken } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { UserService } from '../user.service';
import { Neo4jQueryService } from '../../../neo4-j/neo4-j.service';
import { UserDocument } from '../../Schemas/user.schema';
import { User } from '@sport-activity-app/domain';
import { HttpException } from '@nestjs/common';
describe('UserService', () => {
let userService: UserService;
let userModel: Model<UserDocument>;
let neo4jQueryService: Neo4jQueryService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UserService,
Neo4jQueryService,
{
provide: getModelToken('User'),
useValue: {
// mock Mongoose Model methods used in the UserService class
findByIdAndDelete: jest.fn(),
create: jest.fn(),
},
},
{
provide: getModelToken('SportEvent'),
useValue: {
// mock Mongoose Model methods used in the UserService class
},
},
],
}).compile();
userService = module.get<UserService>(UserService);
userModel = module.get<Model<UserDocument>>(getModelToken('User'));
neo4jQueryService = module.get<Neo4jQueryService>(Neo4jQueryService);
});
it('should be defined', () => {
expect(userService).toBeDefined();
});
});
Я получаю сообщение об ошибке: «TypeError: невозможно прочитать свойства неопределенного (чтение« inspectModules »)». Я понятия не имею, что происходит. Кто-нибудь знает?
[ОБНОВЛЕНО]
Эта ошибка указывает на то, что где-то есть оператор (возможно, в библиотеке), который выглядит примерно так (где foo
не определено):
foo.inspectModules(...)
Если у вас есть это в вашем коде, исправьте это. Если его нет в вашем коде, посмотрите, используете ли вы правильные версии библиотек или есть более свежие версии, которые вы можете использовать.
Обновите до версии '@nestjs/testing': ^9.3.12
Спасибо, я уже понял это, но забыл обновить этот пост. Я все равно дам вам кредиты.