Antes de responder a essa pergunta, você precisa decidir o que realmente deseja alcançar.
Você escreve código. Você espera que ele cumpra seu contrato (em outras palavras, ele faz o que deve fazer. Escrever o que deve fazer é um passo gigantesco para algumas pessoas).
Para estar razoavelmente convencido de que o código faz o que deveria, você o observa por tempo suficiente ou escreve um código de teste que testa casos suficientes para convencê-lo "se o código passar em todos esses testes, está correto".
Frequentemente, você está interessado apenas na interface definida publicamente de algum código. Se eu usar sua biblioteca, não me importo como você a fez funcionar corretamente, apenas se ela funciona corretamente. Verifico se sua biblioteca está correta executando testes de unidade.
Mas você está criando a biblioteca. Conseguir que funcione corretamente pode ser difícil de alcançar. Digamos que eu só me importo com a biblioteca executando a operação X corretamente, então eu tenho um teste de unidade para X. Você, o desenvolvedor responsável por criar a biblioteca, implementa o X combinando as etapas A, B e C, que são totalmente não triviais. Para que sua biblioteca funcione, adicione testes para verificar se A, B e C funcionam corretamente. Você quer esses testes. Dizer "você não deve ter testes de unidade para métodos privados" é inútil. Você deseja testes para esses métodos particulares. Talvez alguém lhe diga que o teste de unidade de métodos privados está errado. Mas isso significa apenas que você não pode chamá-los de "testes de unidade", mas de "testes particulares" ou o que você quiser.
A linguagem Swift resolve o problema que você não deseja expor A, B, C como métodos públicos, apenas porque deseja testá-lo, atribuindo às funções um atributo "testável". O compilador permite que métodos testáveis privados sejam chamados de testes de unidade, mas não de código que não seja de teste.