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
}