[OCA] 파워플랫폼 마스터즈 - End Point 리팩토링(4)

오경찬·2022년 9월 14일
0

Invoke Test

저번에 workflow의 Invoke까지 작성해봤기 때문에 이번에는 이 코드가 잘 작동하는지 테스트 코드를 작성해본다.

개인적으로 생각하며 테스트 코드를 짜보았는데 통과는 하였다 하지만 이테스트가 통과한다고 다된것인지, 아니면 어떤 값을 뱉어줘야 테스트가 통과하는지 잘모르기 때문에 이부분은 멘토님께 물어보기로 했다.


이때 까지 팀원들과 회의후 이슈를 한명이 몰아서 작성하였지만 Invoke부분은 내 담당이기 때문에 개인적으로 이슈를 올렸다.

그리고 오피스 아워때 여러가지를 알려주셨다.

  1. 테스트코드중 ReadAsAsync<T>부분은 진짜 NHN Cloud에서 API를 요청하는 거기 때문에 테스트 할때 직접 불러오게 되면 비정상적인 접근으로 처리될수도 있으므로 불렀다 치고 테스트를 진행해야한다고 하셨다.
  2. 입력 값중에 headers와 requestUrl의 값이 필요한데 테스트용에서는 2가지의 방법이 있다고 하셨다. 직접 값을 불러와서 테스트를 하는것 OR 테스트용으로 직접 값을 넣어주는 방법이 있다고 하시고, 후자의 방법이 좋다고 하셨다.

그렇게 테스트 코드를 멘토님 께서 도와주셨다!

[DataTestMethod]
        [DataRow(HttpVerbs.POST, HttpStatusCode.OK, true, 200, "hello world", "lorem ipsum")]
        public async Task Given_Payload_When_Invoke_InvokeAsync_Then_It_Should_Return_Result(string method, HttpStatusCode statusCode, bool isSuccessful, int resultCode, string resultMessage, string body)
        {
            var model = new FakeResponseModel()
            {
                Header = new ResponseHeaderModel()
                {
                    IsSuccessful = isSuccessful,
                    ResultCode = resultCode,
                    ResultMessage = resultMessage
                },
                Body = body
            };
            var content = new ObjectContent<FakeResponseModel>(model, new JsonMediaTypeFormatter(), MediaTypeNames.Application.Json);
            var options = new HttpMessageOptions()
            {
                HttpResponseMessage = new HttpResponseMessage(statusCode) { Content = content }
            };

            var handler = new FakeHttpMessageHandler(options);

            var http = new HttpClient(handler);
            this._factory.Setup(p => p.CreateClient(It.IsAny<string>())).Returns(http);

            var workflow = new HttpTriggerWorkflow(this._factory.Object);

            var header = new RequestHeaderModel() { AppKey = "hello", SecretKey = "world" };
            var headers = typeof(HttpTriggerWorkflow).GetField("_headers", BindingFlags.Instance | BindingFlags.NonPublic);
            headers.SetValue(workflow, header);

            var url = "http://localhost:7071/api/HttpTrigger";
            var requestUrl = typeof(HttpTriggerWorkflow).GetField("_requestUrl", BindingFlags.Instance | BindingFlags.NonPublic);
            requestUrl.SetValue(workflow, url);

            var load = new FakeRequestModel()
            {
                FakeProperty1 = "lorem ipsum"
            };
            var payload = typeof(HttpTriggerWorkflow).GetField("_payload", BindingFlags.Instance | BindingFlags.NonPublic);
            payload.SetValue(workflow, load);

            var result = await workflow.InvokeAsync<FakeResponseModel>(new HttpMethod(method)).ConfigureAwait(false);

            result.Header.IsSuccessful.Should().Be(isSuccessful);
            result.Header.ResultCode.Should().Be(resultCode);
            result.Header.ResultMessage.Should().Be(resultMessage);
            result.Body.Should().Be(body);
        }

직접 값을 넣지 않는 FakeModel을 작성하여 필요한 값들을 실제로 없는 값을 넣어주는 것이다!


테스트결과 잘 돌아가는것을 알수가 있다.

workflow에 있는 함수도 수정하였다. 아래는 같고 위에 payload의 값이 없을때 request에 값을 넣어주는 것을 추가하였다! 팀원들이 다되면 테스트를 돌려보고 PR을 빨리 날려보고 싶다~!~!

profile
코린이 입니당 :)

0개의 댓글