[Backend API] Implement endpoint for create event details #213#281
[Backend API] Implement endpoint for create event details #213#281tae0y wants to merge 49 commits intoaliencube:mainfrom
Conversation
이 문서 참조해 보세요: https://learn.microsoft.com/rest/api/storageservices/designing-a-scalable-partitioning-strategy-for-azure-table-storage |
|
필요하다면 새 태스크 이슈를 하나 생성해서 bicep 파일을 만들어 두는 것도 좋아요. https://github.com/Azure-Samples/azd-starter-bicep/tree/main/infra/core/storage 우리 bicep 구조는 이걸 따라가고 있으므로 이 파일을 복사해서 넣으시구요, 테이블까지 하나 생성하는 형태로 수정하면 됩니다. 그리고 우리 |
|
@tae0y 서비스 레이어, 리포지토리 레이어 추가해 뒀습니다. 확인해 보시고, 나머지 로직을 추가해 보면 될 듯 해요. |
|
@justinyoo 서비스 레이어, 리포지토리 레이어 병합했습니다! |
|
@tae0y 테스트가 깨지는데 확인 부탁해욥! |
넵! 확인해보겠습니다 |
|
테스트코드 작성완료했고, |
Azure.AI.OpenAI 버전 올라가며 이슈가 있어서 아래 PR에 댓글 남겨두었습니다. |
@justinyoo |
src/AzureOpenAIProxy.ApiApp/Repositories/AdminEventRepository.cs
Outdated
Show resolved
Hide resolved
|
|
||
| // Act | ||
| Func<Task> func = async () => await repository.CreateEvent(eventDetails); | ||
| var result = await repository.CreateEvent(eventDetails); |
There was a problem hiding this comment.
이게 동작하나요????
https://learn.microsoft.com/en-us/dotnet/azure/sdk/unit-testing-mocking?tabs=nsubstitute
만약에 동작한다면, 그건 그것대로 문제 같은데... 왜냐면 목킹이 제대로 안 된 것 같아서;;;
There was a problem hiding this comment.
오.....! ㅠㅠㅠ 보내주신 문서보고 다시 해보겠습니다
There was a problem hiding this comment.
(수정내용)
단위 테스트 자체에 이해도가 낮아서, 아직 테스트 방법을 갈피를 잡지 못한 것 같습니다ㅠㅠ
우선 tableServiceClient가 tableClient를 반환하는 동작,
tableClient에서 호출되는 AddEntityAsync의 동작도 목킹을 추가했습니다.
(테스트목표)
이 테스트 메서드는 파라미터로 전달한 객체가 오류없이 잘 반환되는지,
그래서 파라미터로 전달한 것과 반환된 것이 동일한지 확인해보고 싶었어요.
(궁금한점)
음 저희 단위 테스트 코드를 보면 대체로 동작을 비슷한 방법으로 목킹하고 있는데
만약 어떠어떠한 부분이 잘 동작한다면, 이란 가정하에 나머지 부분이 어떻게 동작하는지를 확인하는 걸까요?
There was a problem hiding this comment.
(궁금한점)
음 저희 단위 테스트 코드를 보면 대체로 동작을 비슷한 방법으로 목킹하고 있는데 만약 어떠어떠한 부분이 잘 동작한다면, 이란 가정하에 나머지 부분이 어떻게 동작하는지를 확인하는 걸까요?
단위테스트는 내가 테스트하고자 하는 메소드가 제대로의도한대로 작동하는 것만을 확인합니다. 따라서, 그 안에서 어떤 일이 벌어지는지는 테스트하지 않아요.
예를 들어서 지금과 같이 CreateEvent라는 메소드를 보면, 그 안에서 TableClient를 만들잖아요? 근데, 이건 우리 메소드가 하는 코어 로직하고는 다르죠. 사실 어떻게 보면 이건 외부에서 인젝션해 주는 거나 마찬가지라서, 이 부분은 목킹으로 넘어가면 됩니다.
또한가지는 만약에 TableClient에서 우리가 AddEntity 메소드를 호출한다고 가정하면, 실제 상황에서는 이 메소드 호출시 에러가 나는 경우도 있겠죠? 그러면 AddEntity 메소드를 에러가 나는 상황으로 목킹해서 CreateEvent 메소드가 어떤식으로 에러 처리를 하는지 확인해야 할 겁니다. 또한 AddEntity 메소드를 에러가 나지 않는 상황으로 목킹해서 그 결과값을 테스트하면 됩니다.
정리하자면 우리가 테스트하려는 대상은 CreateEvent이고, 그 안에 들어가는 의존성 개체라든가 데이터는 가짜 데이터를 심어서 그 가짜 데이터를 바탕으로 우리 CreateEvent 메소드가 예상하는 대로 동작하는지를 확인하는 게 단위테스트의 목적입니다.
|
빌드 재시도하니 해결됨.
|
| public async Task Given_Instance_When_CreateEvent_Invoked_Then_It_Should_Not_Throw_Exception() | ||
| { | ||
| // Arrange | ||
| var settings = Substitute.For<StorageAccountSettings>(); | ||
| var tableServiceClient = Substitute.For<TableServiceClient>(); | ||
| var tableClient = Substitute.For<TableClient>(); | ||
| tableServiceClient.GetTableClient(Arg.Any<string>()).Returns(tableClient); | ||
| tableClient.AddEntityAsync<AdminEventDetails>(Arg.Any<AdminEventDetails>()) | ||
| .Returns(Task.FromResult(default(Response))); | ||
| var eventDetails = new AdminEventDetails(); | ||
| var repository = new AdminEventRepository(tableServiceClient, settings); | ||
|
|
||
| // Act | ||
| Func<Task> func = () => repository.CreateEvent(eventDetails); | ||
|
|
||
| // Assert | ||
| await func.Should().NotThrowAsync<InvalidOperationException>(); | ||
| } |
There was a problem hiding this comment.
아래에서 예외가 발생한다는 것을 테스트했고, 여기서는 예외가 발생하지 않고 결과를 반환한다는 것을 테스트하면 좋겠습니다.
There was a problem hiding this comment.
repository.CreateEvent는 예외가 발생하지 않으면 메서드 인수를 그대로 반환합니다.
그래서 result.Should().BeEquivalentTo(eventDetails); 리턴값이 인수와 동일한지 확인했습니다!
| public async Task Given_Instance_When_CreateEvent_Invoked_Then_It_Should_Not_Throw_Exception() | ||
| { | ||
| // Arrange | ||
| var eventDetails = new AdminEventDetails(); | ||
|
|
||
| var repository = Substitute.For<IAdminEventRepository>(); | ||
| var service = new AdminEventService(repository); | ||
|
|
||
| repository.CreateEvent(Arg.Any<AdminEventDetails>()).Returns(eventDetails); | ||
|
|
||
| // Act | ||
| Func<Task> func = async () => await service.CreateEvent(eventDetails); | ||
| Func<Task> func = () => service.CreateEvent(eventDetails); | ||
|
|
||
| // Assert | ||
| func.Should().ThrowAsync<NotImplementedException>(); | ||
| await func.Should().NotThrowAsync<InvalidOperationException>(); | ||
| } |
There was a problem hiding this comment.
여기도 마찬가지로 예외를 반환하지 않고 결과값을 반환한다는 것을 테스트합니다.
진행상황을 공유하기 위한 PR 제출입니다.
#213 이슈 관련
az storage account create -n tae0ymanulstorage -g rg-tae0y -l koreacentral --subscription osscaappsettings에서 참조, 서비스는Program에서 생성하여 의존성 주입azd up으로 배포되지 않음