我有这个结构:
type Event interface {
Accept(EventVisitor)
}
type Like struct {
}
func (l *Like) Accept(visitor EventVisitor) {
visitor.visitLike(l)
}
如何测试event
是Like
个实例?
func TestEventCreation(t *testing.T) {
event, err := New(0)
if err != nil {
t.Error(err)
}
if reflect.TypeOf(event) != Like {
t.Error("Assertion error")
}
}
我明白了:
类型Like不是表达式事件事件
答案 0 :(得分:29)
您可以直接投射并查看它是否失败:
event, err := New(0)
if err != nil {
t.Error(err)
}
_, ok := event.(Like)
if !ok {
t.Error("Assertion error")
}
答案 1 :(得分:4)
TypeOf()
方法返回Type
类型的对象,您可以使用Name()
方法将该类型的名称作为字符串。
我还没有测试过这个,但是这样的事情可能有用:
if reflect.TypeOf(event).Name() != "Like" {
答案 2 :(得分:4)
迟到的答案,但这很好用
package main
import (
"fmt"
"reflect"
)
type SomeStruct1 struct{}
type SomeStruct2 struct{}
func IsInstanceOf(objectPtr, typePtr interface{}) bool {
return reflect.TypeOf(objectPtr) == reflect.TypeOf(typePtr)
}
func main() {
//sample variables
someString := "Some String"
someFloat := float32(2.4)
someStruct1 := SomeStruct1{}
someStruct2 := SomeStruct2{}
someStruct1Ptr := &SomeStruct1{}
// primitive string
fmt.Println("string <-> *string \t\t", IsInstanceOf(someString, (*string)(nil))) //false
fmt.Println("*string <-> *string \t\t", IsInstanceOf(&someString, (*string)(nil))) //true
// primitive float32
fmt.Println("float32 <-> *float32 \t\t", IsInstanceOf(someFloat, (*float32)(nil))) //false
fmt.Println("*float32 <-> *float32 \t\t", IsInstanceOf(&someFloat, (*float32)(nil))) //true
// structure
fmt.Println("SomeStruct1 <-> *SomeStruct1 \t", IsInstanceOf(someStruct1, (*SomeStruct1)(nil))) //false
fmt.Println("*SomeStruct1 <-> *SomeStruct1 \t", IsInstanceOf(&someStruct1, (*SomeStruct1)(nil))) //true
fmt.Println("*SomeStruct2 <-> *SomeStruct1 \t", IsInstanceOf(&someStruct2, (*SomeStruct1)(nil))) //false
fmt.Println("*SomeStruct1 <-> *SomeStruct1 \t", IsInstanceOf(someStruct1Ptr, (*SomeStruct1)(nil))) //true
}
游乐场(在线运行):https://play.golang.org/p/tcQqdzUGMlL