2017-12-11 12 views
0

"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と思われるので、これは大丈夫ですかどうかを知りたいのですが、私は望ましい結果を得るために組み合わせて、多くの機能を持っているようにテストが厄介回っています。

答えて

1

関数validateDataの内部を複数回テストすることは避けてください。

コールの変更を中断して、具体的な関数validateDataを呼び出されたと主張するモックで置き換えることができれば、validateDataが呼び出されたことを検証するのに十分でなければなりません。

validateDataを、指定された入力に対してハードコードされた出力を返すスタブ、つまり事前にパッケージ化されたバージョンに置き換えることができる場合は、validateDataがよく知られている場合に呼び出し元が正しく動作することを検証できます既知の入力の値。

最後に、同じ入力を使用してvalidateDataを検証し、上記のスタブで使用したものと同じ出力が期待される場合、実稼働環境に置かれたときに正しく動作することを確認できます。少なくとも、スタブを使用して検証し、その後validateDataを検証した場合は、

多くの場所で同じテストを繰り返すことは面倒であり、メンテナンスの負担がかかります。

+0

同じvalidateDataを何度も何度も複数の場所でテストするのは良い考えではありません。 返信いただきありがとうございます。 – Norman

関連する問題