Лично я использую Moq для внутренней зависимости и Moles для внешних факторов (и неприятные статические вещи, навязываемые мне другими), поэтому я не могу дать вам лучший способ, но это способ:
[TestMethod, Owner("ebd"), TestCategory("Proven"), TestCategory("Unit")]
public void MyTest()
{
var myCalled = false;
var myLogger = new SILogger();
myLogger.LogString = (s) => myCalled = true;
var myClass = new MyClass(myLogger);
myClass.MyFunc("abcd");
Assert.IsTrue(myCalled);
}
Ключевой идеей здесь является "SILogger", который является вашей заглушкой для ILogger. Затем вы устанавливаете поведение экземпляра для его «LogString» (что соответствует вашему методу log (string). Вы устанавливаете его для обратного вызова локальной переменной и устанавливаете для него значение true. Затем вы вызываете метод, который должен вызывать log, и утверждаете, что ваш местный теперь правда.
Опять же, я бы обычно делал это с Moq и использовал для этой цели myStub.Verify (), так что, возможно, есть более изящный способ сделать это с родинками, о которых я не знаю. Лично я думаю, что Moles гораздо лучше подходит для «насмешек над немоделируемыми», и я предпочитаю сочетание Moq (для моих собственных интерфейсов и классов) и Moq (для фреймворка и внешних возможностей, таких как File I / O, GUI, Db-соединения и т. Д. ).