Как издеваться / заглушки / шим SerialPort.GetPortNames () - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь протестировать класс ApiController в C #, в частности, функцию, которая использует SerialPort.GetPortNames (). то, что это возвращает, зависит от машины, на которой он запущен, поэтому я хотел бы иметь возможность каким-то образом использовать Shim / stub / mock, чтобы он возвращал фиктивные данные.

с использованием Visual Studio 2015, цели проекта .net 4.5.2 и с использованием Microsoft.VisualStudio.TestTools.UnitTesting

Я думаю, что Microsoft Fakes сможет делать именно то, что мне нужно, но у меня нет Visual Studio Enterprise.

Я узнал, что Moq здесь бесполезен, и поза не работает с версией .Net, на которую ориентирован проект (4.5.2).

Я изучил prig, но не знаю, как его настроить для чего-либо, кроме datetime.now ().

и я не понимаю, как на самом деле тестировать с помощью Smock.

        [HttpGet]
        [Route("PortList")]
        public HttpResponseMessage SerialPortList()
        {
            HttpResponseMessage response;
            try
            {
                List<string> Ports = new List<string>(SerialPort.GetPortNames());
                response = Request.CreateResponse(HttpStatusCode.OK, Ports);
            }
            catch (Exception ex)
            {
                response = Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex);
            }
            return response;
        }

Я хочу иметь возможность скрыть (правильное слово?) Статический метод от SerialPort и заставить его возвращать фиктивный список последовательных портов (["COM1", "COM2"]).

1 Ответ

0 голосов
/ 22 мая 2019

Способ обойти насмешливые статические методы, такие как SerialPort.GetPortNames, - добавить слой косвенности. Самый простой способ в вашем случае - создать перегрузку SerialPortList, которая принимает Func<string[]> примерно так.

public HttpResponseMessage SerialPortList()
{
    return SerialPortList(SerialPort.GetPortNames);
}

public HttpResponseMessage SerialPortList(Func<string[]> getPortNames)
{
    HttpResponseMessage response;
    try
    {
        List<string> Ports = new List<string>(getPortNames());
        response = Request.CreateResponse(HttpStatusCode.OK, Ports);
    }
    catch (Exception ex)
    {
        response = Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex);
    }
    return response;
}

в вашем модульном тесте ...

public void Test()
{
    var portNames = new[] { "COM1" };
    foo.SerialPortList(() => portNames);
}
...