Você considerou colocar as funções no arquivo de cabeçalho do módulo, mas colocá-las em um bloco compilado condicionalmente que só é habilitado em configurações de compilação que são testadas? Seria análogo ter uma classe C ++ com funções públicas e privadas. No entanto, essa não é uma boa opção se você enviar o arquivo de cabeçalho aos usuários e quiser manter essas funções em segredo.
Incluir o arquivo C diretamente é uma opção muito suja, pois ele pode não ser construído exatamente da mesma forma que no código "real" e também pode causar problemas de compilação quando as funções que estão no cabeçalho são implementadas múltiplas vezes (na biblioteca e no código de teste). Dito isso, eu recorri a fazer essas coisas às vezes. Quando as coisas não são projetadas para serem testadas desde o começo, às vezes você precisa se sujar um pouco.