Ich habe eine Methode Sync(), die Config
Feldwerte überschreibt, die in der Umgebung festgelegt sind. Die Namen der Umgebungsvariablen werden durch Unterstreichen von Konfigurationsfeldern abgeleitet und der Name wird in Großbuchstaben dargestellt. Z.B. AppName hat eine entsprechende Umgebungsvariable APP_NAMEWie man Methode mit reflektiertem prüft?
Bitte helfen Sie mir, die folgenden Fälle zu testen. Es gibt komplexe Dinge wie https://golang.org/pkg/reflect/#Value.Set:
Set x auf den Wert v zuweist Es gerät in Panik, wenn CanSet false zurückgibt.. Wie in Go, muss der Wert von x dem Typ von v zugewiesen werden.
Also weiß ich nicht, wie man diesen Fall prüft?
import (
"encoding/json"
"errors"
"fmt"
"os"
"path/filepath"
"reflect"
"strconv"
"strings"
"github.com/BurntSushi/toml"
"github.com/fatih/camelcase"
"gopkg.in/yaml.v2"
)
type Config struct {
AppName string
BaseURL string
Port int
Verbose bool
StaticDir string
ViewsDir string
}
func (c *Config) Sync() error {
cfg := reflect.ValueOf(c).Elem()
cTyp := cfg.Type()
for k := range make([]struct{}, cTyp.NumField()) {
field := cTyp.Field(k)
cm := getEnvName(field.Name)
env := os.Getenv(cm)
if env == "" {
continue
}
switch field.Type.Kind() {
case reflect.String:
cfg.FieldByName(field.Name).SetString(env)
case reflect.Int:
v, err := strconv.Atoi(env)
if err != nil {
return fmt.Errorf("loading config field %s %v", field.Name, err)
}
cfg.FieldByName(field.Name).Set(reflect.ValueOf(v))
case reflect.Bool:
b, err := strconv.ParseBool(env)
if err != nil {
return fmt.Errorf("loading config field %s %v", field.Name, err)
}
cfg.FieldByName(field.Name).SetBool(b)
}
}
return nil
}
Ich möchte testen, ob Code funktioniert, wenn ein Fehler in 'v, err: = strconv.Atoi (env)' innerhalb der Sync() -Methode existiert –
Wie oben erwähnt 'SetTestEnv (" PORT "," any string ")' setzt die Portnummer auf eine Zeichenkette, die nicht in eine Zahl umgewandelt werden kann. In diesem Fall würde der Aufruf von 'Sync' ein Fehler sein, den der erste' if' in der Testfunktion testet. – abhink
hinzugefügt spezifische Fehlerprüfung Details – abhink