jQueryのDeferredを使う下記コードを作成しましたが、400エラーの時にfailが呼ばれると思いましたが、consoleにGET http://localhost:3000/api/favorite?id=100 400 (Bad Request)とでて処理が実行されません。200,201の時はdoneが実行されます。

コード

$(function(){
    $(document).on('click', '#add-fav', function(){
        var id = $(this).data("id");
        addFav(id)
            .done(
                function(data){
                    Materialize.toast(data.name+'を登録しました', 3000);
                })
            .fail(
                function(err){
                    Materialize.toast(err.reason, 3000);
                }
            );
    });

    $(document).on('click', '#del-fav', function(){
        var id = $(this).data("id");
        delFav(id)
            .done(
                function(){
                    Materialize.toast("削除しました。", 3000);
                })
            .fail(
                function(err){
                    Materialize.toast(err.reason, 3000);
                }
            );
    });
});

// お気に入りを追加する。
function addFav(id){
    var defer = $.Deferred();
    $.ajax({
        url: "/api/favorite",
        type: "GET",
        data: {
            id: id
        },
        dataType: "json",
        success: defer.resolve,
        error: defer.reject
    });
    return defer.promise();
}

// お気に入りを削除する。
function delFav(id){
    var defer = $.Deferred();
    $.ajax({
        url: "/api/favorite",
        type: "DELETE",
        data: {
            id: id
        },
        success: defer.resolve,
        error: defer.reject
    });
    return defer.promise();
}

エラー時にfailが呼ばれるようにするにはどのようにすればいいのでしょうか。