0

私は現在、JavaScript で小さなサーバーを作成しており、学習プロセスの一環として、関数の単体テストを作成しています。残念ながら、プロミスを処理する特定のテストで大きな問題に遭遇しました。以下は、テストを容易にするために別の handlePUT 関数を備えたルーター モジュールです。

const express = require('express');
const service = require('../service/user.service');

const dutyStatusRouter = express.Router();
const output = console;

function handlePUT(req, res) {
    service.updateUserStatus()
        .then((fulfilled) => {
            res.status(fulfilled);
            res.send();
        })
        .catch(() => {
            res.status(500);
            res.send();
        });
}

dutyStatusRouter.route('/').put(handlePUT);

updateUserStatus 関数は、基本的にデータベース内のブール値を切り替え、次のようになります。

function updateUserStatus() {
    return new Promise((resolve, reject) => {
        if (…) {
            resolve(201);
        } else if (…) {
            resolve(200);
        } else {
            reject();
        }
    });
}

単体テストに関しては、mocha/chai を使用し、proxyquire を使用してモックの updateUserStatus を作成しています。

const chai = require('chai');
const sinon = require('sinon');
const proxyquire = require('proxyquire');

const serviceStub = {};

describe('=== Unit test ===', () => {
    it('Handle PUT test: promise kept', async () => {
        const dutyStatusRouter = proxyquire('../../router/duty-status.router', {
            '../service/user.service': serviceStub,
        });
        serviceStub.updateUserStatus = () => {
            return new Promise((resolve, reject) => {
                resolve(200);
            });
        };
        const res = {
            status: sinon.fake(),
            send: sinon.fake(),
        };
        await dutyStatusRouter.handlePUT({}, res);
        chai.assert(res.status.calledOnceWith(200));
    });
});

単体テストを実行しようとすると、エラーが発生しますError: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.。追加しようとするdone()と、エラーメッセージが表示されて失敗しますError: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.

4

1 に答える 1