2017-12-11 21 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"describe 블록에서 테스트되었습니다.

테스트 소프트웨어에서는 괜찮습니까?

또한이 두 함수를 express와 함께 재사용해야하므로 "validateData"에 대한 테스트가 3 번 테스트됩니다.

1. #validateData, 2. #createUser and 3. #POST /users

나는 나에게 좋아 보이지만 내가 원하는 결과를 얻기 위해 결합 된 많은 기능을 가지고 테스트가 지저분 의존하고 있기 때문에이 확인 있는지 알고 싶습니다.

답변

1

validateData 함수의 내부를 두 번 이상 테스트하지 않으려합니다.

호출 변경을 중단하고 구체적인 함수 validateData를 호출 된 것으로 주장 할 수있는 mock으로 바꿀 수 있다면 validateData가 호출되는지 확인하기에 충분해야합니다.

validateData를 스텁 (예 : 지정된 입력에 대해 하드 코딩 된 출력을 반환하는 미리 패키지 된 버전)으로 바꿀 수있는 경우 validateData가 잘 알려진 경우 호출자가 올바르게 작동하는지 확인하는 데 사용할 수 있습니다 잘 알려진 입력에 대한 값.

마지막으로 동일한 입력을 사용하여 validateData를 확인하고 위의 스텁에서 사용한 것과 같은 출력을 기대할 경우 프로덕션 환경에 적용 할 때 작동하는지 꽤 확신 할 수 있습니다. 적어도 스텁을 사용하여 검증 된 경우와 나중에 validateData를 검증 한 경우.

여러 곳에서 같은 테스트를 반복하는 것은 지저분하고 유지 관리 부담을 유발할 수 있습니다.

+0

같은 "validateData"를 여러 번 테스트하고 여러 위치에서 테스트하는 것이 좋을지도 모릅니다. 응답 해 주셔서 감사합니다. – Norman