服务中的模拟存储库,节点TypeScript

时间:2019-12-09 14:04:35

标签: node.js typescript mocking jestjs

我正在尝试进行单元测试,为此我必须模拟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.

1 个答案:

答案 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来提供测试数据库。默认情况下,它在没有持久性的内存存储中使用。