【发布时间】:2021-06-02 08:58:10
【问题描述】:
我正在像这样在 Nestjs 中测试服务:
@Injectable()
export class ProductsService {
private readonly products: Map<string, Product> = new Map();
async create(product: Product): Promise<{ id: string; product: Product }> {
return new Promise((resolve, reject) => {
let productAllowed: boolean;
// do some magic
// eslint-disable-next-line prefer-const
productAllowed = true;
if (!productAllowed) {
reject(new NotAcceptableException('Such product exists'));
}
this.products.set('id', product);
resolve({
id: 'id',
product,
});
});
}
async findOne(id: string): Promise<Product> {
return new Promise((resolve, reject) => {
if (!this.products.has(id)) {
reject(new NotAcceptableException('No such product exists'));
}
resolve(this.products.get(id));
});
}
}
我可以测试 create() 并且没关系。 但是在测试 findOne() 时遇到了麻烦:
我需要一个 Product 存在于 products Map 中,以便我可以通过 ID 找到它;但它是空的。所以我需要一种在调用 findOne() 之前以某种方式播种或模拟它的方法:
describe('findOne()', () => {
it('should return a product', async () => {
const result: Product = {
name: 'product',
price: 100,
category: 'junk',
};
expect(await service.findOne('id')).toStrictEqual(result);
});
it('should throw error on wrong id', async () => {
const result = new NotAcceptableException('No such product found');
expect(await service.findOne('not-id')).toThrowError(result);
});
});
【问题讨论】:
-
无论你用
productAllowed做什么都是一个非常糟糕的想法。 -
我知道,我是临时加的;例如,我将检查名称是否重复或返回错误而不是重写现有产品
标签: javascript unit-testing jestjs nestjs