public async Task OnUnsubscribe_StartAddingFiles_AddOrCancelThenRemoveIndex(int initFilesCount, int newFilesCount) { var searcher = new Mock <ISearcher <string, string> >(); var indexer = new Mock <IIndexer <string, string> >(MockBehavior.Strict); var tokenizer = new Mock <ITokenizer <string> >(); var analyzer = new FileAnalyzer(tokenizer.Object, searcher.Object, indexer.Object); using var tmp = new TempFolder(initFilesCount); var folder = tmp.FolderPath; await Task.Run(async() => await analyzer.Subscribe(folder)); SpinWait.SpinUntil(() => !analyzer.IsIndexing); var unsubscribe = Task.Run(async() => await analyzer.Unsubscribe(folder)); await Task.Delay(10); var newFiles = new List <string>(); for (var i = 0; i < newFilesCount; i++) { var sequence = new MockSequence(); var file = tmp.CreateFile(); indexer.InSequence(sequence).Setup(x => x.Add(file, It.IsAny <IEnumerable <string> >())); indexer.InSequence(sequence).Setup(x => x.Remove(file)); newFiles.Add(file); } await unsubscribe; foreach (var file in newFiles) { indexer.Verify(x => x.Add(file, It.IsAny <IEnumerable <string> >()), Times.AtMostOnce); indexer.Verify(x => x.Remove(file, It.IsAny <IEnumerable <string> >()), Times.AtMostOnce); } }