public void CannotRenderComponentsIfGCed() { // Arrange var renderer = new NoOpRenderer(); // Act var componentId = new Func <int>(() => { var component = new TestComponent(builder => throw new NotImplementedException("Should not be invoked")); return(renderer.AssignComponentId(component)); })(); // Since there are no unit test references to 'component' here, the GC // should be able to collect it GC.Collect(); GC.WaitForPendingFinalizers(); // Assert Assert.ThrowsAny <Exception>(() => { renderer.RenderNewBatch(componentId); }); }
public void ComponentsAreNotPinnedInMemory() { // It's important that the Renderer base class does not itself pin in memory // any of the component instances that were attached to it (or by extension, // their descendants). This is because as the set of active components changes // over time, we need the GC to be able to release unused ones, and there isn't // any other mechanism for explicitly destroying components when they stop // being referenced. var renderer = new NoOpRenderer(); AssertCanBeCollected(() => { var component = new TestComponent(null); renderer.AssignComponentId(component); return(component); }); }
public void CanRenderComponentsIfNotGCed() { // Arrange var renderer = new NoOpRenderer(); var didRender = false; // Act var component = new TestComponent(builder => { didRender = true; }); var componentId = renderer.AssignComponentId(component); // Unlike the preceding test, we still have a reference to the component // instance on the stack here, so the following should not cause it to // be collected. Then when we call RenderComponent, there should be no error. GC.Collect(); GC.WaitForPendingFinalizers(); renderer.RenderNewBatch(componentId); // Assert Assert.True(didRender); }