작업 진행
1. 폴더 구조 잡기
// baseURI -> 서버 주소 + 포트
// endPoint -> 미리 정의
// 자신에 IP 주소 입력 해야 함 - 192.168.0.22
const baseUri = 'http://192.168.0.22:80';
const pathUser = '/user';
const epSignUp = '$pathUser/sign-up';
const epSignIn = '$pathUser/sign-in';
const pathTodo = '/todos';
const epTodoList = '$pathTodo/all';
const epTodoById = '$pathTodo/{id}';
const epTodoCreate = '$pathTodo/create';
class UserDto {
String email;
String password;
UserDto({required this.email, required this.password});
@override
String toString() {
return 'UserDto{email: $email, password: $password}';
}
}
import 'package:class_my_todo_v1/models/entity/user_entity.dart';
import '../../models/dto/user_dto.dart';
abstract class UserRepository {
UserEntity signIn(UserDto userDto);
void signUp();
}
// 단위 테스트 작성 해보기
import 'package:class_my_todo_v1/models/dto/user_dto.dart';
import 'package:class_my_todo_v1/models/entity/user_entity.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository_impl.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('회원 관리 도메인 테스트', () {
test('사용자 로그인 테스트', () async {
// given
UserRepository userRepository = UserRepositoryImpl();
UserDto userDto =
UserDto(email: 'hong@example.com', password: 'hong1234');
// when
UserEntity userEntity = await userRepository.signIn(userDto);
// then
expect(userEntity, isA<UserEntity>()); // 데이터 타입이 UserEntity 확인
expect(userEntity.username, '홍길동');
});
});
}
// 단위 테스트 작성 해보기
import 'package:class_my_todo_v1/models/dto/user_dto.dart';
import 'package:class_my_todo_v1/models/entity/user_entity.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository_impl.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('회원 관리 도메인 테스트', () {
test('사용자 로그인 테스트', () async {
// given
UserRepository userRepository = UserRepositoryImpl();
UserDto userDto =
UserDto(email: 'hong@example.com', password: 'hong1234');
// when
UserEntity userEntity = await userRepository.signIn(userDto);
// then
expect(userEntity, isA<UserEntity>()); // 데이터 타입이 UserEntity 확인
expect(userEntity.username, '홍길동');
});
});
}
class UserEntity {
int userId;
String username;
String email;
UserEntity(
{required this.userId, required this.username, required this.email});
@override
String toString() {
return 'UserEntity{userId: $userId, username: $username, email: $email}';
}
// 변환 기능 추가
// factory 메서드 활용
factory UserEntity.fromJson(Map<String, dynamic> json) {
return UserEntity(
userId: json['userId'] as int,
username: json['username'] as String,
email: json['email'] as String,
);
}
}
class UserDto {
String? username;
String email;
String password;
UserDto({required this.email, required this.password, this.username});
Map<String, dynamic> toJson() {
return {'email': email, 'password': password, 'username': username ?? ''};
}
@override
String toString() {
return 'UserDto{email: $email, password: $password}';
}
}
import 'package:class_my_todo_v1/models/entity/user_entity.dart';
import '../../models/dto/user_dto.dart';
abstract class UserRepository {
Future<UserEntity> signIn(UserDto userDto);
Future<int> signUp(UserDto userDto);
}
import 'package:class_my_todo_v1/models/dto/user_dto.dart';
import 'package:class_my_todo_v1/models/entity/user_entity.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository.dart';
import 'package:class_my_todo_v1/shared/api.dart';
import 'package:class_my_todo_v1/shared/http.dart';
import 'package:dio/dio.dart';
// 싱글톤 처리
class UserRepositoryImpl implements UserRepository {
UserRepositoryImpl._single();
// 외부에서 접근할 수 있는 변수를 static 처리
static final UserRepositoryImpl _instance = UserRepositoryImpl._single();
// 1 dart 언어에서 factory 키워드 - 생성자, 메서드
// factory 생성자 - 매번 클래스에인스턴스를 같은 녀셕으로 반환 처리
factory UserRepositoryImpl() {
return _instance;
}
@override
Future<UserEntity> signIn(UserDto userDto) async {
try {
// 사용자의 정보 요청 -> GET( 보안상에 이유로 POST 처리)
// BaseURI + epSignUp
// http://192.168.0.22:80/user/sign-in
// userDto --> json 문자열 형식
// dio -> 이 처리를 하기 위해서 규칙 --> DTO 안에 toJson 메서드를 구현해 놓아야 한다.
Response response = await dio.post(epSignIn, data: userDto);
print(response.headers['Authorization']); // token 확인
print(response.data); // body 영역 데이터 확인
print(response.toString()); //response 전체 확인
return UserEntity.fromJson(response.data);
} catch (e) {
return UserEntity(userId: -1, username: '', email: '');
}
}
@override
Future<int> signUp(UserDto userDto) {
// TODO: implement signUp
throw UnimplementedError();
}
}
테스트
// 단위 테스트 작성 해보기
import 'package:class_my_todo_v1/models/dto/user_dto.dart';
import 'package:class_my_todo_v1/models/entity/user_entity.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository_impl.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('회원 관리 도메인 테스트', () {
test('사용자 로그인 테스트', () async {
// given
UserRepository userRepository = UserRepositoryImpl();
UserDto userDto =
UserDto(email: 'hong@example.com', password: 'hong1234');
// when
UserEntity userEntity = await userRepository.signIn(userDto);
// then
expect(userEntity, isA<UserEntity>()); // 데이터 타입이 UserEntity 확인
expect(userEntity.username, '홍길동');
});
});
}
'Flutter' 카테고리의 다른 글
용어 정리 - 1 (0) | 2023.11.02 |
---|---|
테스트 종류 (0) | 2023.11.02 |
Flutter - RiverPod 이란 (0) | 2023.11.01 |
theme 적용하기 (0) | 2023.11.01 |
JWT 구축 하기 (0) | 2023.10.30 |