Мне нужен совет по стилю для тестирования этого кода (Objective-) C ++, я заключил в скобки часть Objective
, так как не думаю, что она должна иметь какое-либо отношение к этому тесту.
class Probe
{
public:
bool playing();
}
bool Probe::playing()
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
// Logic here to determine if iTunes is playing requires a running iTunes.
// The behavior can also differ depending if iTunes is playing a DVD, CD,
// Stream, a File, something from the iTunes store, and a bunch of other factors
[pool release];
return 1;
}
Как уже упоминалось в коде, поведение этого метода зависит от сведений об окружающей среде, на которые я не могу рассчитывать при выполнении тестов (которые я еще не начал писать).
Как эффективно проводить тестирование в таких условиях, когда вы полагаетесь на скрипт-мост, или на адаптер com, или на вышестоящий API. Например, я хочу убедиться, что другой метод print_whats_playing()
ничего не печатает, если ничего не воспроизводится, или что какое-то другое условие выполняется нормальным образом.
Есть второй аргумент в пользу этого, который заключается в том, чтобы изолировать (а не для удобства) мой набор тестов от на самом деле , нуждающихся в обращении к этим системным службам или API-интерфейсам, возможно, машиностроение заблокировано и может не достигли API или другого условия. Особенно в этом случае, как обеспечить сбой вызова API (сетевого или локального), чтобы вы могли правильно проверить состояние ошибки в своем коде?
В моем доме (Ruby-land) вы могли бы «заглушить» (см. http://martinfowler.com/articles/mocksArentStubs.html) или «высмеять» роль, что в Ruby легко, потому что вы можете просто переопределить тестовый класс.
Кроме того, в отдельных тестовых примерах вы можете использовать методы короткого замыкания, например, probe.expects(:playing).once.returns(false)
- естественно, в C ++ все будет не так просто, но, возможно, есть что-то, чем я могу наслаждаться?