This question is sort of a duplicate, but since I can't comment on other questions I've had to open a new one.
I'm running into a bug in a jasmine test where a function is supposed to handle an error from a service call. The service call in question returns an RxJS Observable of an HttpResponse. The function being tested seems to not receive anything from the service, even when using a spy to throw the error. The code follows this structure:
component.ts:
public thingThatCallsService() {
    this.foo = false;
    this.service.bar()
        .subscribe(
            (res) => {log(res)},
            (err) => {
                log(err) // Logs empty string during test
                if (err.status === 400) this.foo = true;
            }
        );
}
mockService.ts: (The test suite is set to use this instead of the actual service)
public bar() {
    return of(new HttpResponse());
}
test.ts:
it("sets foo to true if bar returns an error", fakeAsync(() => {
    spyOn(service, "bar").and.returnValue(
        throwError(() => new HttpErrorResponse({status: 400}))
    );
    component.thingThatCallsService();
    tick();
    componentFixture.detectChanges();
    expect(service.bar).toHaveBeenCalled();
    expect(component.foo).toBeTrue(); // Keeps failing
}))
Questions like this one and this one either have answers where a string should be returned, not an object with a status field; or answers that contain outdated/invalid code (for instance, new Error({status: 404}) is not a valid instantiation of an Error).
It should also be noted that the code works correctly outside of the test; i.e. when the service call encounters an error with a specific status code, foo is set to true.
Any advice on how to have the Observable properly throw an error for the subscription to handle would be much appreciated. Thanks!
 
    