Моя команда столкнулась с той же ошибкой в прошлом месяце!
После поиска лучших практик я нашел простой способ сделать это ...
Я рекомендую использовать *.repository.ts
файлы, так что вы можете просто переместить все элементы Mon goose в этот файл, и оставить ваш *.service.spec.ts
намного проще и отделенным. Так что эта ошибка никогда не повторится.
Посмотрите на этот пример:
product.repository.ts
Идея состоит в том, чтобы разместить все Mon goose операций в файле репозитория, таких как update (), delete (), find (), populate (), aggregate (), save () ...
@Injectable()
export class ProductRepository {
constructor(@InjectModel('Product') private readonly model: Model<Product>) {}
async findProduct(id: string): Promise<Product> {
return await this.model.findOne({_id: id}).exec();
}
async save(doc: any): Promise<Product> {
return await new this.model(doc).save();
}
}
product .service.ts
Не используйте @InjectModel
здесь вместо этого введите ProductRepository. Наш сервисный файл должен быть максимально скудным и содержать только бизнес логи c.
@Injectable()
export class ProductService {
constructor(private readonly repository: ProductRepository) {}
async updateAProduct(product: ProductDTO) {
const updatedProduct = await this.repository.findProduct(product.id);
if (product.title) {
updatedProduct.title = product.title;
}
if (product.description) {
updatedProduct.description = product.description;
}
if (product.price) {
updatedProduct.price = product.price;
}
await this.repository.save(updatedProduct);
}
}
product.module.ts
Убедитесь, что у вас ProductRepository
в провайдерах .
@Module({
imports: [MongooseModule.forFeature([{ name: 'Product', schema: ProductSchema }])],
controllers: [ProductController],
providers: [ProductService, ProductRepository],
exports: [ProductService],
})
export class ProductModule {}
product.service.spe c .ts
** Вместо использования getModelToken('Product')
заменить на ProductRepository
.
const mockProductRepository = {
findProduct: jest.fn(),
save: jest.fn(),
};
describe('ProductService', () => {
let service: ProductService;
beforeAll(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
ProductService,
{
provide: ProductRepository,
useValue: mockProductRepository,
}
],
}).compile();
service = module.get<ProductService>(ProductService);
});
describe('Update a product', () => {
it('should update a product sucessfully', async () => {
const findProductStub = {id: 'uuid1', title: 'Title1', description: 'Description1', price: 50.99};
mockProductRepository.findProduct.mockResolvedValue(findProductStub);
const saveProductStub = {id: 'uuid1', title: 'New Title', description: 'Description1', price: 200.00};
mockProductRepository.save.mockResolvedValue(saveProductStub);
const productToUpdateDto = {id: 'uuid1', title: 'New Title', description: 'Description1', price: 200.00};
const result = await service.updateAProduct(productToUpdateDto);
expect(result).toEqual({id: 'uuid1', title: 'New Title', description: 'Description1', price: 200.00});
});
});
});
Надеюсь, я смогу помочь тебе, приятель!