superagentでリダイレクトをフォローしない

2013-03-06T00:00:00+00:00 JavaScript Node.js

何やらsuperagentっていうのがある模様。ちょっと使ってみたのだけどいろいろハマったのでメモ

var superagent = require("superagent"),
    url = require("url");

describe("app user test", function() {

  var user;

  beforeEach(function() {
    user = superagent.agent();
  });

  it("ログインしてないでダッシュボードに見るとリダイレクト", function(done) {
    user.get("http://localhost:5000/dashboard/index")
      .redirects(0)
      .end(function(err, res) {
        expect(res).to.have.property("status");
        expect(res.status).to.equal(302);

        expect(res).to.have.property("header");

        var header = res.header;
        expect(header).to.have.property("location");

        var path = url.parse(header.location).pathname;
        expect(path).to.equal("/dashboard/login");

        /* redirects(0)をしない場合

        expect(res.redirects).not.to.be.empty;

        var redirect_url = url.parse(res.redirects[0]);
        expect(redirect_url.pathname).to.equal("/dashboard/login");
        */

        done();
      });
  });

  it("ログインしてダッシュボードを見る", function(done) {
    user.post("http://localhost:5000/dashboard/auth")
      // これをしないとリクエストなContent-Typeがapplication/jsonになってる
      .set("Content-Type", "application/x-www-form-urlencoded")
      .send({ "userid": "kinjouj", "password": "1234" })
      .end(function(res) {
        expect(res.redirects).not.to.be.empty;

        var redirect_url = url.parse(res.redirects[0]);
        expect(redirect_url.pathname).to.equal("/dashboard/index");

        user.get("http://localhost:5000/dashboard/entry/list")
          .redirects(0)
          .end(function(res) {
            expect(res.status).to.equal(200);

            done();
          });
      });
  });
});

getだとかをする場合にデフォルトでredirects(5)になっているのでリダイレクト先をフォローしちゃって結果がリダイレクト先のレスポンスが返ってくる。そういう場合はredirects(0)しちゃえば良いんじゃないかなと

現状だと特にJSでテスト書くケースっていうのがFunctional Testなケースでしか書かない(単体テストとは別な話として)ので、ぶっちゃけ上記のようにフォーム処理とかするケースにしてもzombie.jsで良いんじゃないかなーって思ったりもするんだけど

んまぁ完璧にネタだなぁって所。まぁ使う機会あればいいね的なところかな

mochaとchaiでJavaScriptをテスト