2015-04-29 47 views
0

我正在嘗試爲我的包編寫一個測試,並且未能比較funcs。這基本上是我在做什麼。如何比較golang中的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) 

我怎樣才能正確地測試我正在檢索是同一個先前添加的功能?

+0

這不是一個回答您的實際問題,但爲什麼你通過類型映射到'GetHandler'處理程序遍歷?你可以返回'bus.handlers [t]',並返回'nil'給未定義的處理程序。 – mkb

+0

@mkb,因爲我很笨哈哈 – David

+0

可能與http://stackoverflow.com/questions/9643205/how-do-i-compare-two-functions-for-pointer-equality-in-the-latest-go - 每週 –

回答

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") 
} 
+0

啊這是一個好主意。謝謝! – David