Следите за методами в Голанге - PullRequest
0 голосов
/ 21 сентября 2018

Есть ли способ шпионить за методами в Голанге?

Например, предположим, у меня есть

type Object struct { 
    A int
    B string
    C *interface{}
}   

func (o *Object) Something(val interface{}) {
    o.A = 102
    // some other business logic under test

    o.SomethingElse(o.C, val)
}

//...

func (o *Object) Process(val interface{}) interface{} { 
    // some business logic

    return 43 // or something else. no me importa ya
}

//...

func (o *Object) SomethingElse(iPtr *interface{}, val interface{}) { 

    processedVal := o.Process(val)
    if iPtr == nil { 
        iPtr = new(interface{})
    }

    *iPtr = val
}

При написании теста против Object.Something нам не нужно заботитьсяо том, что происходит в SomethingElse или Process, вызванном изнутри.Есть ли способ на Голанге изолировать эти зависимости?

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Есть ли способ следить за методами в Голанге?

Нет.

0 голосов
/ 05 января 2019

Мое понимание шпионажа состоит в том, что один метод объекта является фальшивым или насмешливым, а другие - нет.Это невозможно в Go.Но вы можете подделать или смоделировать все ваши зависимости, используя интерфейсы.

Для того, чтобы подделать метод SomethingElse, вы должны поместить его в другую структуру, отдельную от вашей структуры Object.Структуре Object также потребуется интерфейс с методом SomethingElse.

type Object struct {
    A     int
    elser Elser
}

func (o *Object) Something() {
    // o.A = 102
    o.elser.SomethingElse()
}

type Elser interface {
    SomethingElse()
}

Теперь вы можете проверить поведение Object, создав фальшивку, реализующую метод SomethingElse:

type fakeElser struct {
    somethingElseWasCalled bool
}

func (f *fakeElser) SomethingElse() {
    f.somethingElseWasCalled = true
}

func TestSomething(t *testing.T) {
    fake := &fakeElser{}
    o := &Object{
        elser: fake,
    }
    o.Something()

    if o.A != 102 {
        t.Errorf("expected A to be %d", 102)
    }

    if !fake.somethingElseWasCalled {
        t.Error("expected SomethingElse to be called")
    }
}

https://play.golang.org/p/RdmbM6Sj5qU

0 голосов
/ 21 сентября 2018

В go вы можете сделать функции приватными (их можно вызывать только из одного и того же пакета), если вы напишите первую букву в нижнем регистре.

Если вы напишите первую букву в верхнем регистре, вы можете вызывать функцию из любого места

...