我有以下功能,在@poy的帮助下,我能够为其创建模拟以便对其进行单元测试。
现在,我具有包装器功能的问题也需要测试
这是经过工作测试的 原始 功能
func httpReq(cc []string, method string, url string) ([]byte, error) {
httpClient := http.Client{}
req, err := http.NewRequest(method, url, nil)
if err != nil {
return nil, errors.Wrap(err, "failed to execute http request")
}
//Here we are passing user and password
req.SetBasicAuth(cc[1], cc[2])
res, err := httpClient.Do(req)
if err != nil {
fmt.error(err)
}
val, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.error(err)
}
defer res.Body.Close()
return val, nil
}
这是按预期工作的测试,该测试使用
https://golang.org/pkg/net/http/httptest/来模拟http请求。
func Test_httpReq(t *testing.T){
expectedValue = "some-value"
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
u,p,ok := r.BasicAuth()
if !ok || u != "fakeuser" || p != "fakepassword" {
t.Fatal("wrong auth")
}
w.Write([]byte(expectedValue))
})
val, err := httpReq(
[]string{"fakeuser", "fakepassword"},
http.MethodPost,
server.URL,
)
if err != nil{
t.Fatal(err)
}
if val != expectedValue {
t.Fatalf("expected %q to equal %q", val, expectedValue)
}
现在的问题是,我还有另一个函数 需要调用上述函数 ,还需要对其进行测试。
这是使用httpReq的函数,我也需要为其创建测试
func (c *Service) invoke(Connection Connection, args []string) {
service, err := c.getService(Connection, args)
serviceC, err := c.getServiceK(service, []string{"url", “user”, “id”})
c := strings.Fields(serviceC)
//—————Here we are using the http function again
val, err := httpReq(c[1], c[1],”post”, c[0])
if err != nil {
fmt.println(err)
}
fmt.Print(string(val))
}
现在,当我使用测试进行测试时, http请求方法 内部出现错误,因为在这里我无法模拟http。
有没有technique
在Golang
这可以帮助这种哪种情况呢?我已经进行了搜索,例如依赖注入,发现 接口可能会有所帮助
,但是由于这是http,所以我不确定如何执行。
在这种情况下的任何示例对我都会非常有帮助。
服务对象可以具有这样的接口
type Service struct {
serviceK typeK
serviceHttp serviceHttp // of type interface hence can be mocked
}
普通应用程序代码可以使用实际对象初始化服务。测试将包含模拟对象
type Req struct {
}
type Resp struct {
}
type ServiceHttp interface{
HttpReq(params Req)(Resp, error)
}
type Implementation struct {
}
func (i *Implementation)HttpReq(params Req)(Resp, error){
// buid http request
}
func (c *Service) invoke(Connection Connection, args []string) {
service, err := c.getService(Connection, args)
serviceC, err := c.getServiceK(service, []string{"url", “user”, “id”})
c := strings.Fields(serviceC)
serviceImp := c.GetServiceImp()
// init params with the required fields
val, err := c.HttpReq(params)
if err != nil {
fmt.println(err)
}
fmt.Print(string(val))
}
运行测试时,可以使用模拟实现初始化服务对象,该实现返回虚拟响应。
type MockImplementation struct {
}
func (i *MockImplementation)HttpReq(Resp, error){
// return mock response
}
func TestMain(){
services := {
serviceHttp:MockImplementation{},
serviceK: typeK{}, // initialise this
}
}
这是测试它的方法之一。其他方法可能是我猜httpReq返回http.ResponseWriter的地方,您可以使用httptest.ResponseRecorder对其进行测试。
问题内容: 我正在尝试使用一个独立的App作为依赖项来编译一个App,但是当我从该库中编译引用模块时,我从gradle中看到了几条“错误:包不存在”和“错误:找不到符号类”消息。以下是我的两个构建文件。 依赖gradle: 有人可以帮助/经历过吗?Android Studio不会突出显示该类中的任何问题,我可以按住Ctrl键并单击到所引用的包,这似乎意味着它已正确设置… 谢谢! 问题答案: 您不能
我的软件包在依赖项中包含setuptools。安装软件包时,我试图限制setuptools的版本。软件包在安装中有以下限制。py: 它在pyproject.toml有同样的限制: 但是,在使用pip安装my package时,它会下载最新的setuptools 50.3。0 为什么它忽视了这些要求?如何使其不安装最新版本?
我正在开发一个Java项目,使用maven作为依赖项管理器/构建工具。我当前在将依赖项的依赖项解析到正确版本时遇到问题。 有问题的依赖项称为JasperReports-Functions-6.1.0.jar,它不是托管在maven repo中,而是以jar形式提供的。 如何强制jar依赖项使用子依赖项的某个版本?
我已经创建了作曲家包,composer.json是 现在,当我安装 包,我需要那个作曲家安装所有需要的包: 但它没有安装它。 我尝试作曲家更新,作曲家安装。有人能帮忙吗? C项目omposer.json看起来像 我能做的是,作曲家自动安装所有软件包所需的依赖项????谢谢你的建议。
上面的匕首2.0当量是多少? 您可以在GitHub上看到我的项目及其单元测试。
我正在尝试将我的应用程序从使用嵌入式neo4j数据库“升级”到使用基于服务器的设置。 我使用Spring作为框架来建立简单的存储库,它像一个魅力一样工作。 现在,我正在尝试包含org.springframework.data的依赖项:sping-data-neo4j,以便能够连接到neo4j服务器。但是对于gradle和maven以及Spring数据neo4j rest的不同版本,它都失败了。在拿