본문 바로가기

Programing/닷넷

DeviceMock - Func<T> 델리게이터

테스트 주도 개발을 하다보면 데스트 더블(스텁, 목, 스파이...)을 사용하게 된다.

TDD가 오래되다 보니 Mock 프레임워크가 있다. 그런데 구미에 맞는 것을 수행하기 어려운게 있다.


예를 들면 네트워크 통신 등이 있다.

장치와 교신하는 서버를 만들일이 있는데 Socket 클래스를 래핑을 하는 방법을 사용해서 실제 통신과 가짜 객체를 바꾸도록 하였다.


인터페이스야 Receive와 Send 메소드만 있으면 되었는데 문제는 Send호출이 제대로 되었는지, Receive할 데이터를 테스트 마다 설정을 해줘야 할 필요가 있었다.


C#에 있는 함수 델리게이터를 이용해서 구현을 하였다. 결국은 ByteArrayDevice를 써서 이 Mock은 deprecate 되었지만 나중을 위해 기록을 한다.



DeviceMock.cs


public class DeviceMock : IDevice

    {

        private Func<byte[], int> _sendCallback;

        private Func<byte[], int> _recvCallback;


        private DeviceMock(

            Func<byte[], int> sendCallback,

            Func<byte[], int> recvCallback)

        {

            _sendCallback = sendCallback;

            _recvCallback = recvCallback;

        }


        public static DeviceMock GetInstance(byte[] assertReceive, byte[] responseData)

        {

            DeviceMock device = new DeviceMock(

                // 장치가 보내는 정보는 기대치와 일치해야 한다.

                sendBuf =>

                {

                    Assert.AreEqual(assertReceive, sendBuf);

                    return sendBuf.Length;

                },

                // 장치로 부터 수신해야 할 정보

                recvBuf =>

                {

                    Assert.GreaterOrEqual(recvBuf.Length, responseData.Length);

                    responseData.CopyTo(recvBuf, 0);

                    return responseData.Length;

                });


            return device;

        }


//...