我正在尝试进行单元测试,为此我必须模拟this.orderRepository.findById (id);
方法,该方法接受存储库以通过其ID查找对象。返回值已经设置,但是我无法通过测试。我正在开玩笑地建立一个单一测试,这是我在节点上使用打字稿进行的第一个测试。
orderService.ts
import { OrderRepository } from '../repository/orderRepository';
import { Service, Inject, } from 'typedi';
@Service()
export default class OrderService {
constructor(
private orderRepository: OrderRepository,
@Inject('logger') private logger
) {}
public async FindById(id: string){
try{
const orderRecord = await this.orderRepository.findById(id);
return orderRecord;
} catch (e) {
this.logger.error(e);
throw e;
}
}
orderRepository.ts
import {Inject} from 'typedi';
export class OrderRepository {
constructor(
@Inject('orderModel') private orderModel:
Models.OrderModel
) {}
public async findById(id: any) {
return this.orderModel.findById(id);
}
userService.test.ts
import OrderService from '../src/services/order';
import { OrderRepository } from '../src/repository/orderRepository';
import Order from '../src/models/order';
const orderData = {id_product: "564sd654asd5as64d", quantity: 3,
orderStatus: "registeredOrder", deliveryDateResquested: "2019-12-25"};
let orderModel = new Order(orderData);
describe('Order', () => {
let instance: OrderService;
instance = Container.get(OrderService);
var orderRepository: OrderRepository;
var logger;
test('FindById', async () => {
var service = new OrderService(orderRepository, logger);
const spy = OrderRepository.prototype.findById = jest.fn();
spy.mockReturnValue(orderModel);
const result = service.FindById("cenas");
expect(result).toBe(orderModel);
spy.mockRestore();
})
结果测试
Order
✕ FindById (7ms)
● Order › FindById
expect(received).toBe(expected) // Object.is equality
Expected: {"_id": "5def6ec34bf18833fa2afcb0", "id_product":
"564sd654asd5as64d", "orderStatus": "registeredOrder", "quantity": 3,
"requestDate": 2019-12-10T10:09:07.139Z}
Received: {}
Difference:
- Expected
+ Received
- Object {
- "_id": "5def6ec34bf18833fa2afcb0",
- "id_product": "564sd654asd5as64d",
- "orderStatus": "registeredOrder",
- "quantity": 3,
- "requestDate": 2019-12-10T10:09:07.139Z,
- }
+ Promise {}
22 | spy.mockReturnValue(orderModel);
23 | const result = myclass.FindById("cenas");
> 24 | expect(result).toBe(orderModel);
| ^
25 |
26 | spy.mockRestore();
27 | })
at Object.<anonymous> (tests/userService.test.ts:24:20)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 total
Snapshots: 0 total
Time: 2.718s
Ran all test suites.
npm ERR! Test failed. See above for more details.
答案 0 :(得分:0)
我建议您尝试moq.ts库。它使您能够模拟类方法的输入和输出。例如:
const orderRepositoryMock = new Mock<OrderRepository>()
.setup(instance => instance.findById("someID")
.returns(orderModel)
.object()
var service = new OrderService(orderRepositoryMock, logger);
const result = service.FindById("someID");
expect(result).toBe(orderModel); // or assert specific properties
如果使用mongoose
,则可以尝试mock-mongoose lib。当调用mongoose.connect时,Mockgoose通过在背面旋转mongod来提供测试数据库。默认情况下,它在没有持久性的内存存储中使用。