dqdl6469 2015-07-29 16:29
浏览 60
已采纳

测试从恐慌中恢复

I want to test a constructor, but in case some data is not provided I need to panic, how can I recover from that panic in testing?

At the moment I've added in my TestNew func a defer with recover, but in case an element from my map has an empty URL the rest will not be checked.

t.go

package testing

type test {
  url string
}

func New(ops map[string]string) *test {
  if ops["url"] == "" {
    panic("Url missing")
  }
  var t = new(test)
  t.url = ops["url"]
  return t
}

t_test.go

package testing

type testTest map[string]string
var testingTest = []testTest {
  testTest {
    "url": "test",
  },
  testTest{
    "url": "",
  },
}

func NewTest(t *testing.T) {
  defer func() {
    recover()
  }()

  for _, e := range testingTest {
    url := New(e)
    url.hasUrl(t, e["url"])
  }
}

func (s *test) hasUrl(t *testing.T, u string) {
  if s.url != u {
    t.Errorf("Expected %s to be equal with %s", s.url, u)
  }
}
  • 写回答

3条回答 默认 最新

  • douguluan5102 2015-07-29 16:48
    关注

    I would say that designing API for library that relies on panic/recover is not a right way. Go has error pattern so if the method New cannot test, it can return the status instead.

    package testing
    
    type test {
      url string
    }
    
    func New(ops map[string]string) (*test, bool) {
      if ops["url"] == "" {
        return nil, false
      }
      var t = new(test)
      t.url = ops["url"]
      return t, true
    }
    

    and then

    for _, e := range testingTest {
      url, ok := New(e)
      if ok {
        url.hasUrl(t, e["url"])
      }
    }
    

    If you insist on using panic, then you can wrap the invocation into function and recover in it. But then you still would need to provide the status to the caller.

    package main
    
    import "fmt"
    
    func test(e int) {
        if e == 2 {
            panic("panic!")
        }
    }
    
    func main() {
        for _, e := range []int{1, 2, 3} {
            func() {
                defer func() { recover() }()
                test(e)
                fmt.Println("testing", e)
            }()
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP