测试包含锁的函数时,应用程序挂起

时间:2014-12-02 06:22:52

标签: unit-testing go

这是我写的一个函数,它向请求队列添加一个请求:

func (self *RequestQueue) addRequest(request *Request) {

    self.requestLock.Lock()
    self.queue[request.NormalizedUrl()] = request.ResponseChannel
    self.requestLock.Unlock()
}

这是其中一项测试:

func TestAddRequest(t *testing.T) {

    before := len(rq.queue)

    r := SampleRequests(1)[0]
    rq.addRequest(&r)

    if (len(rq.queue) - 1) != before {
        t.Errorf("Failed to add request to queue")
    }
}

当我运行此测试时,应用程序挂起。如果我评论这个测试,一切正常。 我认为问题是函数内部的锁定。有什么我做错了吗? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

问题是SampleRequests()函数中的无限循环:

func SampleRequests(num int) []Request {

    requests := make([]Request, num, num+10)
    for i := 0; i < len(requests); i++ {
        r := NewRequest("GET", "http://api.openweathermap.org/data/2.5/weather", nil)
        r.Params.Set("lat", "35")
        r.Params.Add("lon", "139")
        r.Params.Add("units", "metric")

        requests = append(requests, r)
    }

    return requests
}

我正在检查i是否小于for循环的延续条件中数组的长度。每次迭代时,一个项目被添加到数组中,长度增加并且for循环继续执行。