"validateData"という関数は独立してテストされていますが、簡単にするために2つのテストがありますが、この関数を別の関数に組み込んだ場合、同じテストを繰り返すことがわかりました(例:統合テストを適用する際に、機能をテストする正しい方法は何でしょうか?
のsrc /コントローラ/ユーザー/ createUser.js
export function validateData(data) {
if (!data) {
const err = new Error('data must be present');
err.code = 400;
throw err;
}
return data;
}
export async function createUser(data) {
validateData(data);
try {
const user = await UserModel.create(data);
return 'ok';
} catch(err) {
throw err;
}
}
export default createUser;
のsrc /ルーター/ユーザー/ index.js
// Dependencies:
import { Router } from 'express';
import users from 'controllers/user/createUser';
import { methodNotAllowed } from 'utils/helpers';
// Helpers:
const router = Router();
router.route('/users')
.post((req, res) => {
createUser(req.body)
.then(summary => res.status(201).json({ message: "created" }))
.catch(err => res.status(400).json({ err: err.message }));
})
.all(methodNotAllowed(`Use solely POST method in this action.`));
テスト/コントローラ/ユーザー/ createUser.test.js
import { should, expect } from 'chai';
import { validateData, createUser } from 'controllers/user/createUser';
describe('Controller',() => {
describe('#validateData',() => {
describe('when data is not send',() => {
it("should return error: 'data must be present'",() => {
(() => validateData(null))
.should.Throw("'data' must be present")
.with.property('code', 400);
});
});
describe('when data is sent',() => {
it("should return the same data input",() => {
const input = { firstName: 'Norman', lastName: 'etc' };
const output = validateData(input);
output.should.equal(input);
});
});
});
describe('#createUser',() => {
describe('when data is not send',() => {
it("should return error: 'data must be present'", async() => {
try {
await createUser(null)
} catch(err) {
err.should.include({
code: 400,
message: "data must be present"
});
}
});
});
describe('when data is sent',() => {
it("should return the same data input", async() => {
const input = { firstName: 'Norman', lastName: 'etc' };
const output = await createUser(input);
output.should.equal('ok');
});
});
});
});
だから、私はそれも同じエラーを投げることができる「のcreateUser」関数に同じ機能「validateData」を再利用しています表示された場合は、その以前は "#validateData"記述ブロックでテストされていました。
テストソフトウェアでこれは問題ありませんか?
また、これらの2つの関数をexpressで再利用するため、 "validateData"のテストは3回テストされます。
1. #validateData, 2. #createUser and 3. #POST /users
私は、私にはOKと思われるので、これは大丈夫ですかどうかを知りたいのですが、私は望ましい結果を得るために組み合わせて、多くの機能を持っているようにテストが厄介回っています。
同じvalidateDataを何度も何度も複数の場所でテストするのは良い考えではありません。 返信いただきありがとうございます。 – Norman