Start here. This is the direct spoken answer to practice first.
Overview
Signal-based contracts should be tested as Angular binds and renders them, not by mutating internal state around the framework.
I create the component through TestBed and supply inputs through setInput, a host component, or Angular's input binding support. I trigger the user action that should emit an output and observe the public event rather than invoking an internal handler. After changing a signal or dispatching a DOM event, I wait for the fixture to become stable before checking the rendered result.