通過使用 ClearReceivedCalls() 擴充套件方法,可以使替代例項忘記先前的所有呼叫。
比如說我們有一個 ICommand 介面,我們想讓 OnceOffCommandRunne r接收一個 ICommand 然後僅執行一次。
1 public interface ICommand 2 { 3 void Execute(); 4 } 5 6 public class OnceOffCommandRunner 7 { 8 ICommand command; 9 public OnceOffCommandRunner(ICommand command) 10 { 11 this.command = command; 12 } 13 public void Run() 14 { 15 if (command == null) return; 16 command.Execute(); 17 command = null; 18 } 19 }
如果我們為 ICommand 建立替代,則我們可以其在第一執行時即被呼叫,然後忘記之前的所有呼叫,之後再確定其沒有被再次呼叫。
1 [TestMethod] 2 public void Test_ClearReceivedCalls_ForgetPreviousCalls() 3 { 4 var command = Substitute.For<ICommand>(); 5 var runner = new OnceOffCommandRunner(command); 6 7 // 第一次執行 8 runner.Run(); 9 command.Received().Execute(); 10 11 // 忘記前面對command的呼叫 12 command.ClearReceivedCalls(); 13 14 // 第二次執行 15 runner.Run(); 16 command.DidNotReceive().Execute(); 17 }
ClearReceivedCalls() 不會清理通過 Returns() 為替代例項設定的返回值。如果我們需要這麼做,則可通過再次呼叫 Returns() 來替換之前指定的值的方式來進行。