2014-09-25 105 views
2

我正试图编写一个测试方法来注册我的娱乐应用程序。请看下面的代码用csrf测试发布方法

package tests 

import "github.com/revel/revel" 
import "github.com/PuerkitoBio/goquery" 
import "bytes" 
import "net/url" 

//import "net/http" 

var csrf string 

type AccountTest struct { 
    revel.TestSuite 
} 

func (self *AccountTest) Before() { 
    //println("Set up") 
} 

func (self *AccountTest) TestGetSignUp() { 
    self.Get("/signup") 
    site := bytes.NewBuffer(self.ResponseBody) 
    doc, _ := goquery.NewDocumentFromReader(site) 
    doc.Find("input").Each(func(i int, s *goquery.Selection) { 
     name, exists := s.Attr("name") 
     if name == "csrf_token" && exists { 
      csrf, _ = s.Attr("value") 
     } 
    }) 
    self.AssertOk() 
    self.AssertContains("Sign Up") 
    self.AssertContentType("text/html; charset=utf-8") 
} 

func (self *AccountTest) TestPostSignUp() { 
    self.PostForm("/signup", url.Values{ 
     "name":   {"cormier"}, 
     "email":  {"cormisample.com"}, 
     "emailConfirm": {"[email protected]"}, 
     "password":  {"Test!1234"}, 
     "termof":  {"true"}, 
     "csrf_token": {csrf}, 
    }) 
    self.AssertOk() 
    self.AssertContentType("text/html; charset=utf-8") 
} 

func (self *AccountTest) After() { 
    //println("Tear down") 
} 

测试不通过TestPostSignUp函数传递,好像,该请求是通过CSRF中间件,我实现revel-csrf拒绝。正如你在上面看到的,我读取了csrf标记并保存到变量(csrf)中。通过Postform请求我传递了变量,但不起作用。

我的问题是,如何做一个测试,通过csrf保护的post请求。

+0

这将会是巨大的,如果你能为我们提供新的内置功能CSRF一些反馈:https://github.com/revel/revel/blob /master/modules/csrf/app/csrf_test.go – Brenden 2014-10-30 00:03:18

回答

4

我解决这个问题如下:

package tests 

    import "github.com/revel/revel" 
    import "github.com/PuerkitoBio/goquery" 
    import "bytes" 
    import "net/url" 

    //import "net/http" 

    var csrf string 

    type AccountTest struct { 
     revel.TestSuite 
    } 

    func (self *AccountTest) Before() { 

     self.Get("/signup") 
     site := bytes.NewBuffer(self.ResponseBody) 
     doc, _ := goquery.NewDocumentFromReader(site) 
     doc.Find("input").Each(func(i int, s *goquery.Selection) { 
      name, exists := s.Attr("name") 
      if name == "csrf_token" && exists { 
       csrf, _ = s.Attr("value") 
      } 
     }) 

    } 

    func (self *AccountTest) TestSignUp() { 

     self.PostForm("/signup", url.Values{ 
      "name":   {"cormier"}, 
      "email":  {"[email protected]"}, 
      "emailConfirm": {"[email protected]"}, 
      "password":  {"Test!1234"}, 
      "termof":  {"true"}, 
      "csrf_token": {csrf}, 
     }) 
     self.AssertOk() 
     self.AssertContentType("text/html; charset=utf-8") 
    } 

    func (self *AccountTest) After() { 
    }