node.js - 服务中的模拟存储库, Node TypeScript

标签 node.js typescript mocking jestjs

我正在尝试进行单元测试,为此我必须模拟 this.orderRepository.findById (id); 方法,该方法接受存储库以通过其 ID 查找对象。返回值已经设置了,但是我无法通过测试。我正在使用 jest 构建单一测试,这是我使用 typescript 在 Node 中进行的第一个测试。

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.

最佳答案

我建议你尝试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库。当调用 mongoose.connect 时,Mockgoose 通过在后面旋转 mongod 来提供测试数据库。默认情况下,它在没有持久性的内存存储中使用。

关于node.js - 服务中的模拟存储库, Node TypeScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59250526/

相关文章:

javascript - 如何不触发路由器中间件

android - 电话验证/OTP 后检测具有相同电话号码的两部电话/听筒

typescript - TSLint - 禁用成员的字母顺序

typescript - 如何在 TypeScript 的 Koa Debug模式下将自定义中间件函数记录到控制台?

node.js - 使用模拟模块在 Nodejs 中测试 Express Route

node.js - 无法在 bitbucket 管道中的 node.js 图像中执行 bash 脚本

json - 人类如何阅读 json winston 日志文件?

Angular rxjs 订阅

javascript - 在构造函数中 stub 变量?

java - WireMock 是否支持关联?