Я пишу валидатор JSON в Go, и я хочу протестировать другой объект, который взаимодействует с моим Validator. Я использовал Validator как структуру с методами. Чтобы позволить мне вводить mock Validator в другой объект, я добавил интерфейс, который реализует Validator. Затем я заменил типы аргументов, чтобы ожидать интерфейса.Go: Должен ли я использовать интерфейс, позволяющий насмехаться?
// Validator validates JSON documents.
type Validator interface {
// Validate validates a decoded JSON document.
Validate(doc interface{}) (valid bool, err error)
// ValidateString validates a JSON string.
ValidateString(doc string) (valid bool, err error)
}
// SchemaValidator is a JSON validator fixed with a given schema.
// This effectively allows us to partially apply the gojsonschema.Validate()
// function with the schema.
type SchemaValidator struct {
// This loader defines the schema to be used.
schemaLoader gojsonschema.JSONLoader
validationError error
}
// Validate validates the given document against the schema.
func (val *SchemaValidator) Validate(doc interface{}) (valid bool, err error) {
documentLoader := gojsonschema.NewGoLoader(doc)
return val.validate(documentLoader)
}
// ValidateString validates the given string document against the schema.
func (val *SchemaValidator) ValidateString(doc string) (valid bool, err error) {
documentLoader := gojsonschema.NewStringLoader(doc)
return val.validate(documentLoader)
}
Один из моих издевается выглядит следующим образом:
// PassingValidator passes for everything.
type PassingValidator bool
// Validate passes. Always
func (val *PassingValidator) Validate(doc interface{}) (valid bool, err error) {
return true, nil
}
// ValidateString passes. Always
func (val *PassingValidator) ValidateString(doc string) (valid bool, err error) {
return true, nil
}
Это работает, но он не чувствует себя достаточно хорошо. Сотрудники не будут видеть ничего, кроме моего конкретного типа в производственном коде; Я только представил интерфейс для тестирования. Если я делаю это повсюду, я чувствую, что я буду повторять себя, написав интерфейсы для методов, которые будут иметь только одну реальную реализацию.
Есть ли лучший способ сделать это?
Трудно сказать. Может быть, валидатор и другой объект должны войти в один пакет? – Volker
, если вы действительно хотите тип 'validate-able', просто определите его. и показать некоторый код, который поможет нам понять более понятным. –
Что не так с использованием типа интерфейса? Почему он не чувствует себя хорошо? Это дает вам большую гибкость. Вам будет разрешено изменять реализацию так, как вам удобно, без нарушения обратной совместимости. Все, что вам нужно позаботиться, - это реализовать интерфейс. – icza