title: Make mock gin.Context in Golang
body: <p>I'm writing a REST API using Gin framework. But I was faced a trouble testing my controllers and researching TDD and Mock. I tried to apply TDD and Mock to my code but I could not.</p>
  
  <p>I created a very reduced test environment and tried to create a controller test. How do I create a Mock for Gin.Context?</p>
  
  <p><strong>Here's my example code:</strong></p>
  
  <pre><code>package main
  
  import (
      "strconv"
      "github.com/gin-gonic/gin"
  )
  
  // MODELS
  type Users []User
  type User struct {
      Name string `json"name"`
  }
  
  
  func main() {
      r := gin.Default()
  
      r.GET("/users", GetUsers)
      r.GET("/users/:id", GetUser)
  
      r.Run(":8080")
  }
  
  // ROUTES
  func GetUsers(c *gin.Context) {
      repo := UserRepository{}
      ctrl := UserController{}
  
      ctrl.GetAll(c, repo)
  }
  
  func GetUser(c *gin.Context) {
      repo := UserRepository{}
      ctrl := UserController{}
  
      ctrl.Get(c, repo)
  }
  
  // CONTROLLER
  type UserController struct{}
  
  func (ctrl UserController) GetAll(c *gin.Context, repository UserRepositoryIterface) {
      c.JSON(200, repository.GetAll())
  }
  
  func (ctrl UserController) Get(c *gin.Context, repository UserRepositoryIterface) {
  
      id := c.Param("id")
  
      idConv, _ := strconv.Atoi(id)
  
      c.JSON(200, repository.Get(idConv))
  }
  
  // REPOSITORY
  type UserRepository struct{}
  type UserRepositoryIterface interface {
      GetAll() Users
      Get(id int) User
  }
  
  func (r UserRepository) GetAll() Users {
      users := Users{
          {Name : "Wilson"},
          {Name : "Panda"},
      }
  
      return users
  }
  
  func (r UserRepository) Get(id int) User {
      users := Users{
          {Name : "Wilson"},
          {Name : "Panda"},
      }
  
      return users[id-1]
  }
  </code></pre>
  
  <p><strong>My test example:</strong></p>
  
  <pre><code>package main
  
  import(
      "testing"
      _ "github.com/gin-gonic/gin"
  )
  
  type UserRepositoryMock struct{}
  
  func (r UserRepositoryMock) GetAll() Users {
      users := Users{
          {Name : "Wilson"},
          {Name : "Panda"},
      }
  
      return users
  }
  
  func (r UserRepositoryMock) Get(id int) User {
      users := Users{
          {Name : "Wilson"},
          {Name : "Panda"},
      }
  
      return users[id-1]
  }
  
  
  // TESTING REPOSITORY FUNCTIONS
  func TestRepoGetAll(t *testing.T) {
  
      userRepo := UserRepository{}
  
      amountUsers := len(userRepo.GetAll())
  
      if amountUsers != 2 {
          t.Errorf("Esperado %d, recebido %d", 2, amountUsers)
      }
  }
  
  func TestRepoGet(t *testing.T) {
  
      expectedUser := struct{
          Name string
      }{
          "Wilson",
      }
  
      userRepo := UserRepository{}
  
      user := userRepo.Get(1)
  
      if user.Name != expectedUser.Name {
          t.Errorf("Esperado %s, recebido %s", expectedUser.Name, user.Name)
      }
  }
  
  /* HOW TO TEST CONTROLLER?
  func TestControllerGetAll(t *testing.T) {
      gin.SetMode(gin.TestMode)
      c := &amp;gin.Context{}
      c.Status(200)
      repo := UserRepositoryMock{}
      ctrl := UserController{}
  
      ctrl.GetAll(c, repo)
  }
  */
  </code></pre>