Go 在测试中设置/重置模拟函数
示例
本示例说明如何模拟与单元测试无关的函数调用,然后使用defer语句将模拟的函数调用重新分配回其原始函数。
var validate = validateDTD // ParseXML解析b以获取XML元素和值,并将其作为以下内容的映射返回 // 字符串键/值对。 func ParseXML(b []byte) (map[string]string, error) { // 我们不在乎在单元测试中针对DTD进行验证 if err := validate(b); err != nil { return err } // 解析b等的代码 } func validateDTD(b []byte) error { // 从某些外部存储中获取DTD,并使用它来验证b等。 }
在我们的单元测试中
func TestParseXML(t *testing.T) { // 将原始验证函数分配给变量。 originalValidate = validate // 在此测试中使用mockValidate函数。 validate = mockValidate // 将重新分配推迟回原始验证功能。 defer func() { validate = originalValidate }() var input []byte actual, err := ParseXML(input) // 断言等 } func mockValidate(b []byte) error { return nil // 总是返回nil }