鸡计划 - 我如何暂时捕获发送到标准输出的数据

时间:2015-11-22 13:59:59

标签: unit-testing chicken-scheme

我有一个调用(display "foo")

的程序

我想为它编写单元测试,以确认它在那里发送了正确的数据,但display将其输入发送到标准输出:

(define (display x #!optional (port ##sys#standard-output))
  (##sys#check-output-port port #t 'display)
  (##sys#print x #f port) )

问题: 在其他语言中,我可能会将标准输出重新定义为只写入变量的内容,然后在测试后将其重新设置。鸡肉是正确的吗?如果是这样,怎么样?如果没有,那么正确的做法是什么?

注意:传递其他内容作为第二个参数显示不是一个选项,因为我必须改变单元测试的方法。

1 个答案:

答案 0 :(得分:2)

#是可选的第二个参数,默认为标准输出。

您可以执行以下两项操作之一将其发送到字符串。第一种方法是创建一个字符串端口并将其作为可选参数传递给port,而不是使用标准输出端口:

display

第二种是暂时将当前输出端口绑定到字符串端口:

(use ports)
(call-with-output-string
  (lambda (my-string-port)
    (display "foo" my-string-port)))

第二种方式在您调用不接受端口参数的程序时非常有用,例如(use ports) (with-output-to-string (lambda () (display "foo")))

您可以在manual section about string ports

中找到