0
我有一個方法Sync(),它將覆蓋在環境中設置的Config
字段的值。 環境變量名稱通過下劃線從配置字段派生,並將名稱大寫。例如。 AppName將具有相應的環境變量APP_NAME如何用反映測試方法?
請幫我測試以下情況。有複雜的東西,如https://golang.org/pkg/reflect/#Value.Set:
設置將x賦值給值v。如果CanSet返回false,則會發生混亂。和 一樣,x的值必須可以賦值給v的類型。
所以我不知道如何測試這種情況?
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
}
我想測試代碼是否在Sync()方法中的'v,err:= strconv.Atoi(env)'中出現錯誤 –
如上所述,SetTestEnv(「PORT」,「any string 「)'將端口號設置爲無法轉換爲數字的字符串。在這種情況下,調用'Sync'會導致測試函數中第一個'if'正在測試的錯誤。 – abhink
添加了特定的錯誤檢查詳細信息 – abhink