如今
>日常工作中的另一个重要角色是编写测试。测试确保(或应保证:d)美国编写的所有代码都在其预期方面工作,因此,当该功能在生产环境下运行时,它不会发生任何惊喜。
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type respbody struct {
results []pokemon `json:"results"`
}
type pokemon struct {
name string `json:"name"`
}
const url = "https://pokeapi.co"
func main() {
pkmns, err := fetchpokemon(url)
if err != nil {
fmt.println(err)
return
}
for _, pkmn := range pkmns {
fmt.println(pkmn.name)
}
}
func fetchpokemon(u string) ([]pokemon, error) {
r, err := http.get(fmt.sprintf("%s/api/v2/pokemon", u))
if err != nil {
return nil, err
}
defer r.body.close()
resp := respbody{}
err = json.newdecoder(r.body).decode(&resp)
if err != nil {
return nil, err
}
return resp.results, nil
}
httptest
是go的包裹。它允许创建可以在测试中使用的模拟服务器。它的主要优点是我们不会在项目中添加任何额外的依赖性。但是,它不会自动拦截请求。
>
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type respbody struct {
results []pokemon `json:"results"`
}
type pokemon struct {
name string `json:"name"`
}
const url = "https://pokeapi.co"
func main() {
pkmns, err := fetchpokemon(url)
if err != nil {
fmt.println(err)
return
}
for _, pkmn := range pkmns {
fmt.println(pkmn.name)
}
}
func fetchpokemon(u string) ([]pokemon, error) {
r, err := http.get(fmt.sprintf("%s/api/v2/pokemon", u))
if err != nil {
return nil, err
}
defer r.body.close()
resp := respbody{}
err = json.newdecoder(r.body).decode(&resp)
if err != nil {
return nil, err
}
return resp.results, nil
}
>
package main
import (
"encoding/json"
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"github.com/vitorsalgado/mocha/v3"
"github.com/vitorsalgado/mocha/v3/expect"
"github.com/vitorsalgado/mocha/v3/reply"
)
func test_mocha(t *testing.t) {
j, err := json.marshal(respbody{results: []pokemon{{name: "charizard"}}})
assert.nil(t, err)
m := mocha.new(t)
m.start()
scoped := m.addmocks(mocha.get(expect.urlpath("/api/v2/pokemon")).
reply(reply.ok().bodystring(string(j))))
p, err := fetchpokemon(m.url())
fmt.println(m.url())
assert.nil(t, err)
assert.true(t, scoped.called())
assert.equal(t, p[0].name, "charizard")
}
package main
import (
"encoding/json"
"testing"
"github.com/h2non/gock"
"github.com/stretchr/testify/assert"
)
func test_gock(t *testing.t) {
defer gock.off()
j, err := json.marshal(respbody{results: []pokemon{{name: "charizard"}}})
assert.nil(t, err)
gock.new("https://pokeapi.co").
get("/api/v2/pokemon").
reply(200).
json(j)
p, err := fetchpokemon(url)
assert.nil(t, err)
assert.equal(t, p[0].name, "charizard")
}
package main
import (
"encoding/json"
"net/http"
"testing"
"github.com/steinfletcher/apitest"
"github.com/stretchr/testify/assert"
)
func Test_APItest(t *testing.T) {
j, err := json.Marshal(RespBody{Results: []Pokemon{{Name: "Charizard"}}})
assert.Nil(t, err)
defer apitest.NewMock().
Get("https://pokeapi.co/api/v2/pokemon").
RespondWith().
Body(string(j)).
Status(http.StatusOK).
EndStandalone()()
p, err := FetchPokemon(URL)
assert.Nil(t, err)
assert.Equal(t, p[0].Name, "Charizard")
}
如果没有问题,请检查其他条件。您希望一个更丰富的api吗?更完整的依赖性还是较小的依赖性?在您的情况下选择有意义的事物。就我个人而言,我最喜欢apitest,我主张它在团队中使用,因为我认为这是最完整的。
>。
>
以上就是测试出站API调用的最佳方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号