为了账号安全,请及时绑定邮箱和手机立即绑定

运行测试时无效的内存地址或 nil 指针取消引用

运行测试时无效的内存地址或 nil 指针取消引用

Go
POPMUISE 2022-05-18 17:04:15
我知道那里有类似的问题,但在这种情况下,我们不必处理初始化变量。在 内pkg/cluster,我有 3 个文件:cluster.go业务代码在哪里cluster_test.go用我的测试cluster_test_mocks.go有很多用于模拟的预初始化值。我主要是模拟 google go sdk 中使用的结构。我有一个模拟类型作为依赖于 go sdk 库的几个函数的容器,type MockGcloudProvider struct{}和几个(包范围)结构初始化,它们充当来自 go sdk 的模拟响应。import  crm "google.golang.org/api/cloudresourcemanager/v1beta1"var mockedResourceId1 = crm.ResourceId{    Id: "1122334455",}var mockedResourceId2 = crm.ResourceId{    Id: "1122334455",}这是一种模拟上述响应的方法:func (mgcloudProvider *MockGcloudProvider) GetProjectOrganization(ctx context.Context, crmProject crm.Project) (*crm.ResourceId, error) {    var crmRsrId *crm.ResourceId    switch crmProject.Name {    case "project_1":    case "project_2":        crmRsrId = &mockedResourceId1    case "project_3":    case "project_4":        crmRsrId = &mockedResourceId2    }    return crmRsrId, nil    //return nil, errors.New("ERROR while mocking get project organization")}在运行测试时从我的主代码注入和调用最后一个函数时,会导致段违规错误:▶ go test -v -run TestMock=== RUN   TestMock1panic: runtime error: invalid memory address or nil pointer dereference[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x14afe45]goroutine 25 [running]:github.com/myrepo/mytool/pkg/cluster.Count.func1(0x16b3f40, 0x1a61fc0, 0x16b3d40, 0xc0000a6010, 0x15f3eba, 0x10, 0xc0001d46c0, 0xc0000a6c10, 0xc0000a6c20, 0xc0001d4690, ...)        /Users/panteliskaramolegkos/Workspace/mytool/pkg/cluster/cluster.go:111 +0x1d5created by github.com/myrepo/mytool/pkg/cluster.Count        /Users/panteliskaramolegkos/Workspace/mytool/pkg/cluster/cluster.go:105 +0x487exit status 2FAIL    github.com/myrepo/mytool/pkg/cluster   0.538s我知道这很复杂,只是采取任何人从这个烂摊子中做出来的远景......
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

Go 中的 switch 语句与 C 和相关语言的行为不同。所以


    case "project_1":

    case "project_2":

        // do something

意味着对于 project_1 情况,什么都没有做,在其他语言中(我怀疑你很熟悉)就像:


    case "project_1":

        break;

    case "project_2":

        /* do something */

        break;

这样做:


    switch crmProject.Name {

    case "project_1", "project_2":

        crmRsrId = &mockedResourceId1

    case "project_3", "project_4":

        crmRsrId = &mockedResourceId2

    default:

        // maybe handle this by returning an error

    }


查看完整回答
反对 回复 2022-05-18
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

彼得是对的,您需要fallthrough关于案例project_1project_3的陈述。示例: https: //play.golang.org/p/ts2CVoQfcc1

您还可以更改GetProjectOrganization函数以初始化局部变量,而不是默认情况下指向局部变量的指针。示例: https: //play.golang.org/p/iG3mLQA-vTG


查看完整回答
反对 回复 2022-05-18
  • 2 回答
  • 0 关注
  • 305 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号