Согласно TDD я должен написать сначала спецификацию, затем -- тесты, и только потом -- код. Но каким образом я могу написать тесты для функций, которые вызывают системные функции?

Ясно, что их нужно изолировать: для этого используются mock'и, stub'ы и иже с ними. Однако для этого я должен заранее знать, какие функции будут использоваться в реализации. Но это знать невозможно, поскольку сначала идут тесты! Более того, странно опираться при тестировании на реализацию, а не спецификацию: реализация может поменяться спустя некоторое время, а сигнатура тестируемой функции должна быть неизменной.

К тому же, сами вызываемые системные функции могут варьироваться: на Linux для определённой цели может использоваться epoll, а в FreeBSD для той же цели kqueue. Как написать тесты, чтобы их не пришлось бы переписывать для каждой платформы в отдельности? Хотелось бы написать их написать один раз, опираясь на спецификацию (которая пишется тоже один раз) и забыть о них.
@tech@mastodon.ml