RSpec

1
2
3
4
5
describe "MyTestSuite" do
it "does something" do
# test code goes here
end
end

rspec file.rb

这段代码使用 IO.popen 打开了一个管道,用于与子进程进行通信。在 Ruby 中,IO.popen 方法用于创建一个与另一个进程进行通信的管道,并返回一个 IO 对象,可以在这个对象上进行读取或写入操作。

让我们逐行解释这段代码:

  1. IO.popen("./db", "r+") do |pipe|:这行代码打开了一个管道,用于执行名为 "./db" 的子进程,并且允许对这个进程进行读写操作。子进程的标准输入和输出会分别连接到管道的输入和输出端。管道对象被传递给一个块,在这个块内部可以使用管道对象来进行读写操作。
  2. commands.each do |command|:这是一个迭代循环,遍历了一个名为 commands 的数组中的每一个元素,其中每个元素代表一个命令。
  3. pipe.puts command:在循环中,对管道对象 pipe 调用了 puts 方法,将每个命令写入到管道的输入端。这样,每个命令都会被发送给子进程进行执行。
  4. pipe.close_write:在发送完所有命令之后,通过调用 close_write 方法关闭了管道的写入端。这样做可以告诉子进程已经没有更多的输入数据了,从而触发子进程的执行。
  5. raw_output = pipe.gets(nil):最后,使用 gets(nil) 方法从管道的输出端读取了子进程的输出,并将其存储在 raw_output 变量中。在这里,nil 参数表示读取所有可用的输出数据,直到管道被关闭。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/ruby

# describe 是一个块, database表示一个测试集合,里面it表示一个测试例子
describe 'database' do
def run_script(commands)
raw_output = nil
# 打开一个管道,
IO.popen("./db", "r+") do |pipe|
commands.each do |command|
pipe.puts command
end

pipe.close_write

# Read entire output
raw_output = pipe.gets(nil)
end
raw_output.split("\n")
end

it 'inserts and retrieves a row' do
result = run_script([
"insert 1 user1 person1@example.com",
"select",
".exit",
])
expect(result).to match_array([
"db > Executed.",
"db > (1, user1, person1@example.com)",
"Executed.",
"db > ",
])
end
end

匹配规则

image.png

后者为测试脚本 .constants执行输出结果