chicken scheme - 我如何临时捕获发送到标准输出的数据
chicken scheme - how do i temporarily capture data sent to standard output
我有一个程序调用 (display "foo")
我想为它编写一个单元测试,以确认它向那里发送了正确的数据,但是 display
将其输入发送到标准输出:
(define (display x #!optional (port ##sys#standard-output))
(##sys#check-output-port port #t 'display)
(##sys#print x #f port) )
问题:
在其他语言中,我可能会将标准输出重新定义为仅写入变量的内容,然后在测试后将其重新设置。在 chicken 中这样做是正确的吗?如果是这样,如何?如果不是,那么正确的做法是什么?
注意:将其他内容作为第二个参数传递给显示不是一个选项,因为我必须更改我正在单元测试的方法才能这样做。
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")))
第二种方法在调用不接受端口参数的过程时最有用,例如 print
。
您可以在 manual section about string ports 中找到它。
我有一个程序调用 (display "foo")
我想为它编写一个单元测试,以确认它向那里发送了正确的数据,但是 display
将其输入发送到标准输出:
(define (display x #!optional (port ##sys#standard-output))
(##sys#check-output-port port #t 'display)
(##sys#print x #f port) )
问题: 在其他语言中,我可能会将标准输出重新定义为仅写入变量的内容,然后在测试后将其重新设置。在 chicken 中这样做是正确的吗?如果是这样,如何?如果不是,那么正确的做法是什么?
注意:将其他内容作为第二个参数传递给显示不是一个选项,因为我必须更改我正在单元测试的方法才能这样做。
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")))
第二种方法在调用不接受端口参数的过程时最有用,例如 print
。
您可以在 manual section about string ports 中找到它。