【发布时间】:2018-07-12 14:24:31
【问题描述】:
我有这个注册表结构,它有一个取消注册客户端的通道。基本上从映射中删除客户端指针并关闭客户端发送通道。为什么这个测试总是失败
func (r *SocketRegistry) run() {
for {
select {
case client := <-r.Register:
r.clients[client.id] = client
case client := <-r.UnRegister:
delete(r.clients, client.id)
close(client.send)
case payload := <-r.Broadcast:
var regPayload RegistryPayload
json.Unmarshal(payload, ®Payload)
client := r.clients[regPayload.ClientID]
select {
case client.send <- payload:
default:
close(client.send)
delete(r.clients, client.id)
}
}
}
}
//GetClient通过id返回Client指针
func (r *SocketRegistry) GetClient(id string) (*Client, bool) {
if client, ok := r.clients[id]; ok {
return client, ok
}
return &Client{}, false
}
这是测试
func TestRegisterClient(t *testing.T) {
registry := Registry()
go registry.run()
defer registry.stop()
var client Client
client.id = "PROPS"
client.send = make(chan []byte, 256)
registry.Register <- &client
c, _ := registry.GetClient(client.id)
if client.id != c.id {
t.Errorf("Expected client with id: %v got: %v", client.id, c.id)
}
registry.UnRegister <- &client
c, ok := registry.GetClient(client.id)
if ok {
t.Errorf("Expected false got ok: %v and client id: %v got: %v", ok, client.id, c.id)
}
}
就好像地图永远不会删除密钥一样。如果我添加一些日志语句,那么它确实会删除密钥,这让我认为这可能是 goroutines 的时间问题
【问题讨论】:
标签: unit-testing testing go channel goroutine