GraphQL 解析器的单元测试
Unit tests for GraphQL resolvers
我想在 go 中为 GraphQL api (gqlgen) 编写单元测试(我检查了 GraphQL playground 中的功能,一切正常)
架构
type Farmer {
id: Int!
name: String!
surname: String!
dob: Date!
fin: String!
plot_loc_lat: String!
plot_loc_long: String!
createdAt: Time!
updatedAt: Time!
createdBy: String!
updatedBy: String!
}
input NewFarmer {
name: String!
surname: String!
dob: Date!
fin: String!
plot_loc_lat: String!
plot_loc_long: String!
}
type Mutation {
createFarmer(input: NewFarmer!): Farmer!
}
创建解析器
func (r *mutationResolver) CreateFarmer(ctx context.Context, input model.NewFarmer) (*model.Farmer, error) {
//Extract the logged in user's role from the context (previously set up by the middleware)
Role, _ := ctx.Value("role").(string)
//Check if the user has proper permissions to perform the operation
if !utils.Contains([]string{"System Admin", "Farmer"}, Role) {
return nil, errors.New("You are not authorized to access this entity")
}
//Establish connection to the database
db := model.FetchConnection()
//Defer closing
defer db.Close()
//Extract user ID from the context (previously set up by the middleware)
//Pass it to CreatedBy, UpdatedBy fields
UID, _ := ctx.Value("user_id").(string)
//Create a new instance in the table
farmer := model.Farmer{Name: input.Name, Surname: input.Surname, Dob: input.Dob, Fin: input.Fin, PlotLocLat: input.PlotLocLat, PlotLocLong: input.PlotLocLong, CreatedAt: time.Now(), UpdatedAt: time.Now(), CreatedBy: UID, UpdatedBy: UID}
db.Create(&farmer)
return &farmer, nil
}
我尝试编写一个测试函数(遵循这些 two sources )
func TestFarmers(t *testing.T) {
c := client.New(handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{})))
t.Run("Create a farmer", func(t *testing.T) {
q := `
mutation {
createFarmer(input:{name:"Lee", surname:"Mack", dob:"20-May-1968", fin:"1234", plot_loc_lat:"40.8787", plot_loc_long:"89.3454"}){
id,
name,
surname,
dob,
fin,
plot_loc_lat,
plot_loc_long,
createdAt,
updatedAt,
createdBy,
updatedBy
}
}
`
var farmer model.Farmer
c.MustPost(q, &farmer)
require.Equal(t, "Lee", farmer.Name)
require.Equal(t, "Mack", farmer.Surname)
})
}
当我在 VS Code 中按 运行 测试时,它会输出一长串错误。我认为问题可能出在我在测试中定义 GraphQL 客户端的方式上,但我不确定。我是 GraphQL 的新手,一般来说,如果有任何 help/advice,我将不胜感激。谢谢
这里有一个例子:
https://github.com/99designs/gqlgen/blob/master/_examples/todo/todo_test.go
您需要创建一个不同的结构来获取 return
我想在 go 中为 GraphQL api (gqlgen) 编写单元测试(我检查了 GraphQL playground 中的功能,一切正常) 架构
type Farmer {
id: Int!
name: String!
surname: String!
dob: Date!
fin: String!
plot_loc_lat: String!
plot_loc_long: String!
createdAt: Time!
updatedAt: Time!
createdBy: String!
updatedBy: String!
}
input NewFarmer {
name: String!
surname: String!
dob: Date!
fin: String!
plot_loc_lat: String!
plot_loc_long: String!
}
type Mutation {
createFarmer(input: NewFarmer!): Farmer!
}
创建解析器
func (r *mutationResolver) CreateFarmer(ctx context.Context, input model.NewFarmer) (*model.Farmer, error) {
//Extract the logged in user's role from the context (previously set up by the middleware)
Role, _ := ctx.Value("role").(string)
//Check if the user has proper permissions to perform the operation
if !utils.Contains([]string{"System Admin", "Farmer"}, Role) {
return nil, errors.New("You are not authorized to access this entity")
}
//Establish connection to the database
db := model.FetchConnection()
//Defer closing
defer db.Close()
//Extract user ID from the context (previously set up by the middleware)
//Pass it to CreatedBy, UpdatedBy fields
UID, _ := ctx.Value("user_id").(string)
//Create a new instance in the table
farmer := model.Farmer{Name: input.Name, Surname: input.Surname, Dob: input.Dob, Fin: input.Fin, PlotLocLat: input.PlotLocLat, PlotLocLong: input.PlotLocLong, CreatedAt: time.Now(), UpdatedAt: time.Now(), CreatedBy: UID, UpdatedBy: UID}
db.Create(&farmer)
return &farmer, nil
}
我尝试编写一个测试函数(遵循这些 two sources )
func TestFarmers(t *testing.T) {
c := client.New(handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{})))
t.Run("Create a farmer", func(t *testing.T) {
q := `
mutation {
createFarmer(input:{name:"Lee", surname:"Mack", dob:"20-May-1968", fin:"1234", plot_loc_lat:"40.8787", plot_loc_long:"89.3454"}){
id,
name,
surname,
dob,
fin,
plot_loc_lat,
plot_loc_long,
createdAt,
updatedAt,
createdBy,
updatedBy
}
}
`
var farmer model.Farmer
c.MustPost(q, &farmer)
require.Equal(t, "Lee", farmer.Name)
require.Equal(t, "Mack", farmer.Surname)
})
}
当我在 VS Code 中按 运行 测试时,它会输出一长串错误。我认为问题可能出在我在测试中定义 GraphQL 客户端的方式上,但我不确定。我是 GraphQL 的新手,一般来说,如果有任何 help/advice,我将不胜感激。谢谢
这里有一个例子:
https://github.com/99designs/gqlgen/blob/master/_examples/todo/todo_test.go
您需要创建一个不同的结构来获取 return