superagentでリダイレクトをフォローしない
何やら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で良いんじゃないかなーって思ったりもするんだけど
んまぁ完璧にネタだなぁって所。まぁ使う機会あればいいね的なところかな