The problem is that you spy on a function after the function was bound to the event. When jasmine create a spy it will replace the function you spy on with another function.
So what happens here, is that the original function is bound to the event
this.fooView.bind("something:happened", this.onSomethingHappened, this);
After that, the original function is replaced by the spy, but that will not have any effect on the function you pass to the bind
function.
The solution for that is to spy FooController.prototype.onSomethingHappened
before you create a new instance:
it("should do something else when something happens", function() {
var onSomethingHappenedSpy = spyOn(FooController.prototype, "onSomethingHappened");
var fooController = new FooController();
fooController.fooView.trigger("something:happened");
expect(onSomethingHappenedSpy).toHaveBeenCalled();
});