No momento, há um debate em nossa equipe sobre se modificar o design do código para permitir o teste de unidade é um cheiro de código ou até que ponto isso pode ser feito sem ser um cheiro de código. Isso aconteceu porque estamos apenas começando a implementar práticas que estão presentes em praticamente todas as outras empresas de desenvolvimento de software.
Especificamente, teremos um serviço de API da Web que será muito fino. Sua principal responsabilidade será organizar solicitações / respostas da Web e chamar uma API subjacente que contenha a lógica de negócios.
Um exemplo é que planejamos criar uma fábrica que retornará um tipo de método de autenticação. Não precisamos herdar uma interface, pois não prevemos que ela seja outra coisa senão o tipo concreto que será. No entanto, para testar o serviço de API da Web, precisamos zombar desta fábrica.
Isso significa essencialmente que projetamos a classe do controlador da API da Web para aceitar DI (por meio de seu construtor ou setter), o que significa que estamos projetando parte do controlador apenas para permitir o DI e implementando uma interface que de outra forma não precisamos, ou usamos uma estrutura de terceiros como o Ninject para evitar a necessidade de projetar o controlador dessa maneira, mas ainda precisamos criar uma interface.
Alguns membros da equipe parecem relutantes em criar código apenas para testar. Parece-me que deve haver algum compromisso se você espera fazer um teste de unidade, mas não tenho certeza de como acalmar suas preocupações.
Só para esclarecer, este é um projeto totalmente novo, portanto não se trata de modificar o código para permitir o teste de unidade; trata-se de projetar o código que vamos escrever para ser testado por unidade.