AssertionError: ожидается, что заглушка будет вызвана с аргументами 201 - PullRequest
0 голосов
/ 01 апреля 2020

Я новичок в модульном тесте Мокко Синона. Это то, что я пытался получить ожидаемый результат. Но это выдает следующую ошибку.

AssertionError: ожидается, что заглушка будет вызвана с аргументами 201

Может кто-нибудь помочь мне с этим или любым предложением, если я делаю что-то не так.

async createUser(req: Request, res: Response, next: NextFunction) {
    const { name, email, password } = req.body;
    const user = new User({ name, email, password });

    try {
      const userCreated = await userService.createUserService(user);
      res.status(201).json({ status: 201, data: userCreated });
    } catch (err) {
      next(httpErrors(500, err.message));
    }
  }

модульный тест для вышеперечисленного:

import sinon from "sinon";
import { Request, Response } from "express";

import userController from "./user.controller";
import UserService from "../services/user.service";
import User from "../models/user.model";

describe("UserController", () => {
  let userService;

  beforeEach(() => {
    userService = new UserService();
  });

  it("should create user", async () => {
    const mReq = {
      body: {
        name: "mockName",
        email: "mockEmail",
        password: "mockPassword#123"
      }
    } as Request;

    const mRes = {
      status: sinon.stub().returnsThis(),
      json: sinon.stub()
    } as any;

    const mNext = sinon.stub();
    const stubValue = {
      name: "Deepesh"
    };
    const createUserServiceStub = sinon
      .stub(userService, "createUserService")
      .resolves(stubValue);

    await userController.createUser(mReq, mRes, mNext);
    sinon.assert.calledWithExactly(
      createUserServiceStub,
      new User({
        name: "mockName",
        email: "mockEmail",
        password: "mockPassword#123"
      })
    );
    sinon.assert.calledWithExactly(mRes.status, 201);
    sinon.assert.calledWithExactly(mRes.json, {
      status: 201,
      data: { name: "StubName" }
    });
  });
});

user.service.ts

import User, { IUser } from "../models/user.model";
import HashPassword from "../utils/password";

class UserService {
  private user;

  constructor() {
    this.user = User;
  }

  /**
   * Function to check existence of user if not then create new user in db
   * @param user
   */
  public async createUserService(user: IUser): Promise<any> {
    try {
      // Check for existence of user in db
      const userRecord = await this.user.findOne({ email: user.email });
      if (userRecord) {
        throw new Error("RECORD ALREADY EXISTS");
      }

      const encPwd = await HashPassword.encryptPassword(user.password); // Encrypt user entered password
      user.password = encPwd;
      user.role = "user";

      const createdUser = await this.user.create(user); // create user
      return createdUser;
    } catch (error) {
      throw error;
    }
  }
}

export default UserService;

Любая помощь будет очень признательна ..

Заранее спасибо.

1 Ответ

1 голос
/ 01 апреля 2020

Вот решение для модульного тестирования:

controller.ts:

import { NextFunction, Response, Request } from 'express';
import userService from './service';
import User from './model';

const userController = {
  async createUser(req: Request, res: Response, next: NextFunction) {
    const { name, email, password } = req.body;
    const user = new User({ name, email, password });

    try {
      const userCreated = await userService.createUserService(user);
      res.status(201).json({ status: 201, data: userCreated });
    } catch (err) {
      next(err);
    }
  },
};

export default userController;

service.ts:

import User from './model';

const userService = {
  async createUserService(user: User) {
    return {};
  },
};

export default userService;

model.ts:

export default class User {
  constructor(data) {}
}

controller.test.ts:

import userController from './controller';
import { Request } from 'express';
import userService from './service';
import sinon from 'sinon';
import User from './model';

describe('userController', () => {
  it('should create user', async () => {
    const mReq = { body: { name: 'mockName', email: 'mockEmail', password: 'mockPassword#123' } } as Request;
    const mRes = { status: sinon.stub().returnsThis(), json: sinon.stub() } as any;
    const mNext = sinon.stub();
    const stubValue = {
      name: 'StubName',
    };
    const createUserServiceStub = sinon.stub(userService, 'createUserService').resolves(stubValue);
    await userController.createUser(mReq, mRes, mNext);
    sinon.assert.calledWithExactly(
      createUserServiceStub,
      new User({
        name: 'mockName',
        email: 'mockEmail',
        password: 'mockPassword#123',
      }),
    );
    sinon.assert.calledWithExactly(mRes.status, 201);
    sinon.assert.calledWithExactly(mRes.json, { status: 201, data: { name: 'StubName' } });
  });
});

Результаты модульных испытаний с отчетом о покрытии:

  userController
    ✓ should create user


  1 passing (25ms)

---------------|---------|----------|---------|---------|-------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------|---------|----------|---------|---------|-------------------
All files      |   85.71 |      100 |   66.67 |   85.71 |                   
 controller.ts |      90 |      100 |     100 |      90 | 14                
 model.ts      |     100 |      100 |     100 |     100 |                   
 service.ts    |   66.67 |      100 |       0 |   66.67 | 5                 
---------------|---------|----------|---------|---------|-------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...