gpt4 book ai didi

ruby - 如何使用 RSpec 测试子进程的输出

转载 作者:数据小太阳 更新时间:2023-10-29 08:36:26 26 4
gpt4 key购买 nike

我想测试 echo 1 输出 1,但是

expect { `echo 1` }.to output("1").to_stdout

不起作用。它说它没有向 stdout 输出任何内容,而

expect { print 1 }.to output("1").to_stdout

工作正常。为什么第一个不起作用?

最佳答案

expect { `echo 1` }.to output("1").to_stdout

不工作有两个原因:

  1. echo 在子进程中运行。默认情况下,RSpec 的 output 匹配器不处理子进程的输出。但是你可以使用 to_stdout_from_any_process 而不是 to_stdout 来处理子进程,虽然它有点慢。

  2. output 仅适用于发送到与 Ruby 进程相同的标准输出流的输出。反引号打开一个新的标准输出流,将命令的标准输出发送给它,并在命令完成时返回流的内容。我认为您不关心您是使用反引号还是其他方式运行子进程,所以只需使用 system(它将命令的标准输出发送到 Ruby 进程的标准输出流)即可。

解决这两点给了我们这样的期望,它通过了:

expect { system("echo 1") }.to output("1\n").to_stdout_from_any_process

(我必须更改预期值才能通过,因为 echo 添加了一个换行符。)

正如 MilesStanfield 指出的那样,如果您给出的只是测试反引号的输出而不是使用 output 是等效且更容易的:

expect { `echo 1` }.to eq "1\n"

在您可能想到的更复杂的情况下,这可能有效,也可能无效。

关于ruby - 如何使用 RSpec 测试子进程的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35580367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com