Blazor에서 Unit테스트

Blazor 프로젝트에서 Unit테스트 작성 질문

Blazor 프로젝트에서 Unit 테스트를 만드는데 어 특정 함수 테스트하려합니다만 로그인정보를 불러와야합니다.

질문을 올리실 때는 답글을 달아주시는 분이 최대한 상황을 자세히 알 수 있도록 질문을 올려주세요. 다음의 내용이 들어가면 좋습니다.

  • 무엇을 하고자 하는지

    • MSTest를 이용해 Unit Test 프로젝트를 추가하려 합니다.
    • 테스트하려는 함수에서 로그인한 사용자 정보(Claim)을 불러오는 과정이 존재합니다만 Unit Test프로젝트에서 로그인 정보를 넣는 방법을 모르겠습니다.
  • 현재 작성한 코드 중 문제가 되는 부분

    • 테스트를 실행하려는 코드는 아래와 같습니다.
//인증된 사용자 정보를 가져옴

if (userService == null)
{
    //인증 정보 가져오는 부분
    var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
    var user = authState.User;
    if (user.Identity.IsAuthenticated)
    {
        UserSearch userSearch = new UserSearch
        {
            FullName = user.Claims.Where(a => a.Type == "name").First().Value,
            Email = user.Claims.Where(a => a.Type == "emails").First().Value,
        };
    }
}
  • 기대하는 동작
    • 로그인한 사용자의 정보를 가져오는 함수를 테스트하기 위해 UnitTest 프로젝트에서는 어떤 작업이 필요한지 알고싶습니다.
    • 위의 코드의 동작을 실행하기전 어떤 작업을 UnitTest에 추가해야 하는지 알고 싶습니다.
2개의 좋아요

안녕하세요~

이 부분이 테스트 되어야 하는게 맞나요?

혹시 테스트 하고 싶으신 케이스가 user.Identity.IsAuthenticated가 true일 때 실제로 UserSearch라는 객체가 원하는 값을 가지고 생성이 되는지 확인하고 싶은신건가요?

궁금합니다! ㅎㅎ

3개의 좋아요

네 맞습니다. 지정해주신 부분이 테스트 되어 값을 가져와야합니다.
직접 실행할때는 로그인 페이지가 뜨고 로그인한 결과를 가져오기 때문에 문제가 없는데(참고로 Azure AD를 사용하고 있습니다.)
테스트 프로젝트에서는 어떻게 미리 로그인이 된 상태를 넘겨줘야할지 모르겠습니다.

1개의 좋아요

유닛테스트에서는

해당 테스트 로직에서 사용되는 DB관련 데이터나, 로그인 인증, 서버와 통신 부분은

성공적으로 되었다는 간주 하에 순수하게 비즈니스 로직 부분을 테스트 하는게 목적인 것으로 알 고 있습니다.

로그인 인증 부분은 로그인이 성공적으로 되었을때의 인증 Mock데이터를 생성해서 주입하여 테스트 하는게 맞는 것 같습니다.

4개의 좋아요

그렇군요.
인증이 성공했다는 것을 가정하고 함수를 실행해야 한다면 제가 질문드린 부분은 미리 인증이 되었다고 가정한 후 이후의 부분만 실행되는지 확인하도록 짜야되는 거군요.
혹시 Mock 데이터를 생성해 테스트하는 좋은 예제가 있을까요? 가능하면 MSTest로 부탁드립니다.

2개의 좋아요

단위테스트를 이용해서 원하시는 결과를 만들어낼 수 없을 것 같습니다. :disappointed_relieved:

단위테스트를 이용하신다면 전달해 주신 함수가 우리가 원하는 파라미터를 넣었을 때
우리가 예상하는 값이 그대로 나오는지 확인할 수 있습니다.

예를들면

public int Add(int a, int b)
{
    if (a < 0)
        throw new InvalidOperationException("a는 0 미만이 될 수 없습니다.");

    return a + b;
}

이런 함수가 있었을 때 아래와 같은 테스트를 진행해 볼 수 있습니다.

Add(1, 2); // 이때 3이 리턴 되니?
Add(4, 5); // 이때 9가 리턴 되니?
Add(-1, 100); // 이때 InvalidOperationException이 발생하니?

음… 설정파일 등을 이용해서 설정파일이 특정 값이 였을 때 Auzre 테스트 계정으로 로그인하는 코드를 넣어서 테스트 하셔야 할 것 같습니다. 프로덕션 코드에 테스트 코드가 섞이는건 안좋아하지만 다른 방법이 생각나지 않네요.

Auzre 로그인 하시는 방법은 저도 잘 몰라 한번 검색해보시면 좋을 것 같습니다!

1개의 좋아요