Полагаю, ваши шпионы просто перезаписывают друг друга. Вы можете сделать это так:
spyOn(customService, 'doSomething').and.returnValue($q.reject({
status: 409
}));
someService.testSomething(stuff);
// now doSomething is called and $q.reject is retuend
expect(someService.testSomething.calls.argsFor[0]).toEqual([stuff]);
spyOn(customService, 'doSomething').and.returnValue($q.when());
$scope.$apply();
Или вот так, что мне нравится больше:
var index = 0;
spyOn(customService, 'doSomething').and.callFake(() => {
index++;
return index === 1 ? $q.reject({status: 409}) : $q.when();
});