本示例说明如何模拟与单元测试无关的函数调用,然后使用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
}