public void FilterValues() { var inputValues = new IInterface1[] { new MyClass1(), new MyClass2(), new MyClass1(), new MyClass2() }; var outputValues = new List <MyClass1>(); var obs = new PushSubject <IInterface1>(); var filtered = obs.OfType <MyClass1>(); filtered.Subscribe(outputValues.Add); foreach (var item in inputValues) { obs.PushValue(item); } obs.Complete(); Assert.IsTrue(filtered.ToTaskAsync().Wait(5000), "The filtering should complete"); var expected = inputValues.Where(i => i is MyClass1).ToList(); for (int i = 0; i < outputValues.Count; i++) { Assert.AreSame(expected[i], outputValues[i], "all values should match"); } Assert.AreEqual(expected.Count, outputValues.Count, $"nb items from the output must match the input one"); }