-
Notifications
You must be signed in to change notification settings - Fork 18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Backend API] Implement endpoint for create event details #213 #281
base: main
Are you sure you want to change the base?
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 구조는 이걸 따라가고 있으므로 이 파일을 복사해서 넣으시구요, 테이블까지 하나 생성하는 형태로 수정하면 됩니다. 그리고 우리 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코멘트 남겨뒀습니다
@tae0y 서비스 레이어, 리포지토리 레이어 추가해 뒀습니다. 확인해 보시고, 나머지 로직을 추가해 보면 될 듯 해요. |
@justinyoo 서비스 레이어, 리포지토리 레이어 병합했습니다! |
@tae0y 테스트가 깨지는데 확인 부탁해욥! |
넵! 확인해보겠습니다 |
테스트코드 작성완료했고,
|
Azure.AI.OpenAI 버전 올라가며 이슈가 있어서 아래 PR에 댓글 남겨두었습니다. |
@justinyoo |
src/AzureOpenAIProxy.ApiApp/Repositories/AdminEventRepository.cs
Outdated
Show resolved
Hide resolved
@@ -67,10 +67,33 @@ public void Given_Instance_When_CreateEvent_Invoked_Then_It_Should_Throw_Excepti | |||
var repository = new AdminEventRepository(tableServiceClient, settings); | |||
|
|||
// Act | |||
Func<Task> func = async () => await repository.CreateEvent(eventDetails); | |||
var result = await repository.CreateEvent(eventDetails); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이게 동작하나요????
https://learn.microsoft.com/en-us/dotnet/azure/sdk/unit-testing-mocking?tabs=nsubstitute
만약에 동작한다면, 그건 그것대로 문제 같은데... 왜냐면 목킹이 제대로 안 된 것 같아서;;;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오.....! ㅠㅠㅠ 보내주신 문서보고 다시 해보겠습니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(수정내용)
단위 테스트 자체에 이해도가 낮아서, 아직 테스트 방법을 갈피를 잡지 못한 것 같습니다ㅠㅠ
우선 tableServiceClient가 tableClient를 반환하는 동작,
tableClient에서 호출되는 AddEntityAsync의 동작도 목킹을 추가했습니다.
(테스트목표)
이 테스트 메서드는 파라미터로 전달한 객체가 오류없이 잘 반환되는지,
그래서 파라미터로 전달한 것과 반환된 것이 동일한지 확인해보고 싶었어요.
(궁금한점)
음 저희 단위 테스트 코드를 보면 대체로 동작을 비슷한 방법으로 목킹하고 있는데
만약 어떠어떠한 부분이 잘 동작한다면, 이란 가정하에 나머지 부분이 어떻게 동작하는지를 확인하는 걸까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(궁금한점)
음 저희 단위 테스트 코드를 보면 대체로 동작을 비슷한 방법으로 목킹하고 있는데 만약 어떠어떠한 부분이 잘 동작한다면, 이란 가정하에 나머지 부분이 어떻게 동작하는지를 확인하는 걸까요?
단위테스트는 내가 테스트하고자 하는 메소드가 제대로의도한대로 작동하는 것만을 확인합니다. 따라서, 그 안에서 어떤 일이 벌어지는지는 테스트하지 않아요.
예를 들어서 지금과 같이 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아래에서 예외가 발생한다는 것을 테스트했고, 여기서는 예외가 발생하지 않고 결과를 반환한다는 것을 테스트하면 좋겠습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기도 마찬가지로 예외를 반환하지 않고 결과값을 반환한다는 것을 테스트합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
반영했습니다!
진행상황을 공유하기 위한 PR 제출입니다.
#213 이슈 관련
az storage account create -n tae0ymanulstorage -g rg-tae0y -l koreacentral --subscription ossca
appsettings
에서 참조, 서비스는Program
에서 생성하여 의존성 주입azd up
으로 배포되지 않음