현재까지 recipe/tests/폴더 안에는
두 가지 파일이 있는데요. 추가로 teest_reipe_api.py 파일을 작성할게요.
파일 이름이 워낙 직관적이라서 쉽게 이해하겠지만 recipe api 기능을 테스트하기 위한 소스코드를 짜볼게요.
필요한 클래스와 메서드와 모듈을 임포트 할게요.
global scope에서 사용할 RECIPES_URL 변수와, sample_recipe
함수를 선언할게요. (테스트마다 간단히 메서드 하나로 recipe 객체를 생성하기 위함임)
sample_recipe
함수에서 눈여겨 볼만한 점이 update()
메서드인데요. 기존 default(딕셔너리)에서 해당 키가 존재하면 value의 값을변경
해주고 만약 'key가 없으면
key-value`를 더 해주는 방식이에요.
로그인 하지 않고 해당 URL에 접근했을때 401 UNAUTHORIZED 오류를 발생시키게 해줘요.
1개의 셋업 메서드와 2개의 테스트 메서드를 작성해볼게요.
셋업 메서드는 기존 셋업 메서드와 크게 다르지 않아요(유저 생성, 인증)
여기서는 한명의 유저가 2개의 recipe를 db에 등록하는데요.
그리고 클라이언트에서 get요청을 RECIPES_URL 엔드포인트로 보내게 되요.
all()메서드를 통해서 모든 레시피의 퀴레셋을 가져오게 되요.
그래서 이 쿼리셋은 RecipeSerializer클래스의 인자로 들어가고 many=True flag를 작성합니다.
반환시 성공하는 200코드와 response해서 갈 body의 json과 직렬화한 data의 값이 같은지 비교해요.
If the field is used to represent a to-many relationship, you should add the many=True flag to the serializer field.
다른 유저 B가 동일한 recipe를 만들고 A라는 유저가 같은 레시피를 만들었을때의 test 소스코드에요.
바로 위의 테스트 코드와 큰 차이는 보이지 않지만 본인이 등록한 레시피만 가져오게 되요.
차이점: all()로 가져오냐? filter()로 가져오냐?
예상했던 fail이 뜨네요. RecipeSerializer
클래스를 임포트하지 못했다고 합니다.