Se for difícil influenciar a entrada real (como reagir em um erro de disco), você deve criar um wrapper fino ao redor da função, que depende de algum estado global. Nesse caso, eu colocaria esse wrapper em torno de write()
para retornar 0 ou o retorno real de write()
.
Se a sobrecarga do wrapper for muito grande, use #define
para deixar de fora o código do wrapper no sistema de produção, mas pelo menos você pode testar as camadas em cima de write()
para reagir corretamente durante unittests definindo o estado global conforme necessário.