Предположим, у вас было 2 класса, Слушатель и Говорящий. У Talker есть событие Talking, и когда оно запускается, Listener должен выполнить метод vear HeardTalk, как показано ниже:
public class Talker
{
public event EventHandler Talking;
public void Talk()
{
if (Talking != null)
{
Talking(this, null);
}
}
}
public class Listener
{
public void StartListening(Talker talker)
{
talker.Talking += HeardTalk;
}
public void HeardTalk(object sender, EventArgs e)
{
// do something private here
}
}
Как бы вы пошли в модульном тестировании, когда после вызова StartListening вызывается HeardTalk, если не было открытого состояния, отражающего, что метод был вызван? Я мог бы просто добавить такое состояние с целью проверки, но это кажется неуклюжим. В идеале я хотел бы утверждать, что вызов был сделан, способом, подобным тому, что делают фреймворки Mocking, но я не могу издеваться над тестируемым классом.
Есть ли элегантный способ утверждать, что метод вызывается на SUT, не модифицируя его только для целей тестируемости?