0

ユーザー破棄コールバックがユーザーコントローラーのエラーを受け取ったときに何が起こるかをテストしようとしています。destroy がエラーを受け取ると、次のことを行います。

flash('error', 'Can not destroy user');
redirect(path_to.users);

これまでのテストは次のとおりです。

it('should fail on DELETE /users/:id if destroy receives an error', function (done) {
    var User = app.models.User;
    var user = new UserStub();

    User.find = sinon.spy(function (id, callback) {
        callback(null, user);
    });

    user.destroy = sinon.spy(function (callback) {
        callback(new Error());
    });

    request(app)
        .del('/users/55')
        .end(function (err, res) {
            res.header.location.should.include('/users');
            app.didFlash('error').should.be.true;

            done();
        });
});

この質問を見たことがありますが、そのres.header..部分は期待どおりに機能します。ただし、そのリダイレクト後に発生するフラッシュをテストする方法については、まだ混乱しています。

4

1 に答える 1

0

最終的に、破棄コールバックに次のコードを使用するように users_controller を変更しました (リダイレクトには他の問題がありました)。

if (error) {
    flash('error', 'Can not destroy user');
} else {
    flash('info', 'User successfully removed');
}
send(302, "'" + pathTo.users + "'");

mocha.js で使用される init.js ファイルには、アプリ オブジェクトの初期化時にいくつかの部分が含まれています (一部の無関係なコードは省略されています)。

global.getApp = function(done) {
    var app = require('compound').createServer();

    app.renderedViews = [];
    app.flashedMessages = {};

    app._render = app.render;
    app.render = function (viewName, opts, fn) {
        app.renderedViews.push(viewName);

        // Deep-copy flash messages
        var flashes = opts.request.session.flash;
        for(var type in flashes) {
            app.flashedMessages[type] = [];
            for(var i in flashes[type]) {
                app.flashedMessages[type].push(flashes[type][i]);
            }
        }

        return app._render.apply(this, arguments);
    };

    app.use(function (req, res, next) {
        app._request = req;
        next();
    });

    app.didFlash = function (type) {
        var flashes = app._request.session.flash;        
        return !!(app.flashedMessages[type] || (flashes && flashes[type]));

    };

    return app;
};

をチェックする元の方法didFlashレンダリングのみに制限されていましたが、これはフラッシュ メッセージがredirectまたはの前に作成されているかどうかをチェックしますsend

于 2013-09-13T19:01:19.643 に答える