ruby - 为什么会出现字符串/哈希比较失败?
问题描述
我编写了一个发出 HTTP GET 请求的函数(截断和简化)。
# get_request.rb
require "http"
def get_request
HTTP.get("<https://github.com>")
end
我已经为请求编写了一个测试。
require "request"
RSpec.describe "#get_request" do
it "makes a successful GET request" do
# GIVEN
http_response = double("http", body: "Hello world!")
# WHEN
response = get_request
# THEN
expect(HTTP).to receive(:get).with("<https://github.com>").and_return(http_response)
expect(response.body).to eq("Hello world!")
end
end
但是,测试因比较失败而失败。
$ bundle exec rspec
F
Failures:
1) #get_request makes a successful GET request
Failure/Error: expect(response.body).to eq("Hello world!")
expected: "Hello world!"
got: #<HTTP::Response::Body:3fe63e519550 @streaming=false>
(compared using ==)
Diff:
@@ -1,2 +1,2 @@
-"Hello world!"
+#<HTTP::Response::Body:3fe63e519550 @streaming=false>
# ./spec/request_spec.rb:13:in `block (2 levels) in <top (required)>'
Finished in 0.32713 seconds (files took 0.25261 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/request_spec.rb:4 # #get_request makes a successful GET request
为什么response.body
等于<HTTP::Response::Body:3fe63e519550 @streaming=false>
哈希而不是"Hello world!"
我预期的字符串?如何让测试通过?
解决方案
如果你想在测试的底部有异常,你必须使用间谍模式。https://relishapp.com/rspec/rspec-mocks/docs/basics/sies
RSpec.describe "#get_request" do
it "performs the request successfully" do
http_response = double("http", body: "Hello world!")
allow(HTTP).to receive(:get).and_return(http_response)
response = get_request
expect(HTTP).to have_received(:get).with("https://www.github.com")
expect(response).to eq(http_response)
end
end
推荐阅读
- excel - 如何在受保护的工作表中包含的 Excel 柱形图上显示工具提示(UserInterfaceOnly)?
- cocoapods - CocoaPods 指向不存在的 Ruby 文件夹
- jquery - 为什么使用 DOM 接口构建时 SVG 路径折叠为 0x0,但在使用 jQuery 字符串构建时有效
- jpa - JPA 实体管理器合并,对象没有变化
- javascript - 如何隐藏选择字段中的所有其他选项字段
- angular - Angular e2e 在路由后超时之前不会寻找标签
- pytorch - 给定长度列表,重塑和填充张量
- r - 如何在ggplot中显示显示所有栏
- sql-server - 使用触发器插入记录时递增 RECORD_ID
- javascript - 为什么用我
为什么
i<array.length
而不是i=array.length
当我最初编写代码时,我告诉 for 循环遍历数组的长度。我将 for 循环定义为(var i = 0; i=array.length; i++)
. 这创造了一个无限循环。修复它的方法是设置i<array.l