如何比较golang中的funcs

时间:2015-04-29 02:59:58

标签: go

我正在尝试为我的软件包编写一个测试,并且无法比较funcs。这基本上就是我正在做的事情。

package main

import (
    "fmt"
    "reflect"
)

type HandlerFunc func(cmd interface{})

type Bus struct {
    handlers map[reflect.Type]HandlerFunc
}

func (bus *Bus) RegisterHandler(cmd interface{}, handler HandlerFunc) {
    bus.handlers[reflect.TypeOf(cmd)] = handler
}

func (bus *Bus) GetHandler(cmd interface{}) HandlerFunc {
    t := reflect.TypeOf(cmd)

    for kind, handler := range bus.handlers {
        if t == kind {
            return handler
        }
    }

    return nil
}

func New() *Bus {
    return &Bus{
        handlers:    make(map[reflect.Type]HandlerFunc),
    }
}

type RegisterUserCommand struct {}

func main() {
    bus := New()
    handler := func (cmd interface{}) {}

    bus.RegisterHandler(&RegisterUserCommand{}, handler)

    retrieved := bus.GetHandler(&RegisterUserCommand{})

    if retrieved != handler {
        fmt.Println("Not the same!")
        return
    }

    fmt.Println("Same!")
}

retrievedhandler进行比较会导致以下错误

invalid operation: (func(interface {}))(retrieved) != handler (func can only be compared to nil)

我如何正确测试我正在检索的功能与之前添加的功能相同?

1 个答案:

答案 0 :(得分:4)

鉴于您无法比较功能,您可以用不同的方式编写测试。您可以让handler在测试中设置一个布尔值,并通过调用它并查看布尔值是否发生变化来检查您是否获得了正确的函数。

以下是一个例子:

func main() {
    bus := New()
    called := false
    handler := func (cmd interface{}) { called = true }

    bus.RegisterHandler(&RegisterUserCommand{}, handler)
    bus.GetHandler(&RegisterUserCommand{})(nil)

    if called {
        fmt.Println("We got the right handler!")
        return
    }

    fmt.Println("We didn't get the right handler")
}