dimanche 14 avril 2019

How can I use dynamic errors while retaining comparability for testing?

In go I often use

func MyFunc(s someInterface) error {
    err := OtherFunc(s)
    return fmt.Errorf("something wrong: %s", err)
}

So I lose the original error value, because I just take the error string and forge it into a new error. That is what I mean with dynamic errors.

Now consider a test for MyFunc():

func TestMyFunc(t *testing.T) {
    s := mockSomeInterface()
    testErr := MyFunc(s)
    if testErr != interfaceSpecificErrorValue {
        t.Errorf("fail")
    }
}

What would I use for interfaceSpecificErrorValue (which is specific to someInterface in this example)? Or how could I make this testable?

I understand that I can solve this by defining all my possible errors beforehand and give them a constant value. What I am interested in is if there is another way to achieve this, because I like the hierarchical error messages that you can dynamically build up using fmt.Errorf("...: %s, err). There must be a good way to keep the error hierarchy without losing the original value.

(Comparing the output of the Error() method is a possibility, but not a good one.)

Aucun commentaire:

Enregistrer un commentaire