2015-02-01 1 views
2

rspec에서 이러한 종류의 테스트에 얼마나 정확하게 접근하고 있는지 또는 가능한지 확실하지 않습니다. 그것을 Bcrypts,내 응용 프로그램 코드와 내 rspec 테스트에서 데이터 가져 오기

1) user#save 방법은 바이트의 문자열 (이메일 확인 코드를 생성 할 수 SecureRandom를 사용), 데이터베이스에 결과를 저장합니다 :

내 특정 시나리오는 이메일 확인에 관한 것입니다. 원래의 임의 코드 (unhashed)도 사용자에게 전자 메일로 전송됩니다.

2) 내 user#confirm_email 메서드는 전자 메일 확인 코드를 사용하고 BCrypt를 사용하여이를 해시하고 데이터베이스의 기존 해시와 비교합니다. '

모든 것이 잘 작동하지만 #confirm_email의 입력이 무작위이며 #save 내에 생성되고 내 테스트에서 액세스 할 수있는 곳에 저장되어 있지 않으면 시나리오를 테스트하는 방법이 확실하지 않습니다.

내 코드가 메서드 반환 값 이외의 정보를 내 테스트에 전달하는 명확한 방법이 있습니까? 나는 임시 파일에 코드를 저장하고 테스트에서 파일을 읽는 것을 고려해 봤지만, 더 좋은 방법이 있는지 궁금해.

+0

테스트 유형에 대한 자세한 정보를 제공하십시오. 수용 테스트인가, "블랙 박스"인가, 아니면 하위 단위 테스트입니까? * 단위 테스트 *에 저장된 코드에 대한 액세스 권한을 부여하거나 적합한 모의을 적용 할 수없는 이유는 없습니다. 설명 할 때 약간의 테스트 코드 및/또는 테스트하려는 메서드의 코드가 도움이 될 수 있습니다. –

+0

@NeilSlater - 좋은 점 - 테스트는 블랙 박스 일 필요는 없습니다. 여기 어떻게 모의 작품을 사용할 수 있습니까? 나는 시도했지만 결코 전에 성공적으로 사용하는 방법을 결코 이해하지 못했습니다. 대부분의 테스트는 코드를 실행 한 다음 데이터베이스의 출력 또는 결과를 확인합니다. 당신의 도움을 주셔서 감사합니다. – readyornot

답변

3

조롱은 코드의 메서드를 테스트의 내용으로 대체합니다. 정확히 당신이하고 싶은 것입니다. 예로 rspec mocking framework를 사용

, 당신은 테스트에 쓸 수 :

allow(SecureRandom).to receive(:random_bytes).and_return("My Test String") 

는 그런 다음 #confirm_email 코드에 동일한 입력 문자열을 사용합니다. 당신은 통합 테스트를하지 않는다고 가정합니다.

#confirm_email 메서드를 테스트하는 경우 먼저 알려진 바이트 문자열을 사용하여 데이터베이스에 레코드를 만들어 암호화 된 데이터를 만들 수 있습니다.

+0

이것은 정말 멋지다. 감사! :) – readyornot

관련 문제