assert_no_difference 测试期间出现类型错误
TypeError during assert_no_difference test
问题
我正在为 RoR API 编写单元测试,并且我想测试响应正文中的一些条目(我已经为另一个控制器完成的事情)。
基本上,对于 index
方法,我想检查 data
中包含的每个子元素是否与特定子元素共享相同的 id。这是 index
方法的完整测试:
test "should access Membership index - specifix team" do
get api_v1_team_memberships_url(@team),
headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
as: :json
assert_response :success
json_response = JSON.parse(self.response.body)
assert_no_difference @membership.member_id, json_response['data']['attributes']['member_id']
end
但是无论我尝试什么,我都会得到完全相同的错误堆栈,说我的数据类型有问题:
Error:
Api::V1::MembershipsControllerTest#test_should_access_Membership_index_-_specifix_team:
TypeError: no implicit conversion of String into Integer
test/controllers/api/v1/memberships_controller_test.rb:20:in `[]'
test/controllers/api/v1/memberships_controller_test.rb:20:in `block in <class:MembershipsControllerTes
t>'
我真的不明白为什么,因为正如我上面所说,这是我已经为其他一些控制器完成的检查。
assert_equal @task.activity_id, json_response['data']['attributes']['activity_id']
到目前为止我尝试了什么
- 将两个元素从
assert_no_difference
函数转换为字符串 (to_s
) 或整数 (to_i
)
- 使用
assert_equal
代替assert_no_difference
您遇到的错误
TypeError: no implicit conversion of String into Integer
通常是由于试图通过字符串索引从数组中获取值引起的。例如,以下将引发相同的错误
a = [1, 2]
puts a['test']
在你的情况下,我怀疑 json_response
或 json_response['data']
是一个数组。
另外,我相信你想使用 assert_equal
而不是 assert_no_difference
。 assert_no_difference
接受一个数值表达式和一个块;并断言该块执行前后表达式相同。 https://api.rubyonrails.org/v7.0.2.2/classes/ActiveSupport/Testing/Assertions.html#method-i-assert_no_difference
问题
我正在为 RoR API 编写单元测试,并且我想测试响应正文中的一些条目(我已经为另一个控制器完成的事情)。
基本上,对于 index
方法,我想检查 data
中包含的每个子元素是否与特定子元素共享相同的 id。这是 index
方法的完整测试:
test "should access Membership index - specifix team" do
get api_v1_team_memberships_url(@team),
headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
as: :json
assert_response :success
json_response = JSON.parse(self.response.body)
assert_no_difference @membership.member_id, json_response['data']['attributes']['member_id']
end
但是无论我尝试什么,我都会得到完全相同的错误堆栈,说我的数据类型有问题:
Error:
Api::V1::MembershipsControllerTest#test_should_access_Membership_index_-_specifix_team:
TypeError: no implicit conversion of String into Integer
test/controllers/api/v1/memberships_controller_test.rb:20:in `[]'
test/controllers/api/v1/memberships_controller_test.rb:20:in `block in <class:MembershipsControllerTes
t>'
我真的不明白为什么,因为正如我上面所说,这是我已经为其他一些控制器完成的检查。
assert_equal @task.activity_id, json_response['data']['attributes']['activity_id']
到目前为止我尝试了什么
- 将两个元素从
assert_no_difference
函数转换为字符串 (to_s
) 或整数 (to_i
) - 使用
assert_equal
代替assert_no_difference
您遇到的错误
TypeError: no implicit conversion of String into Integer
通常是由于试图通过字符串索引从数组中获取值引起的。例如,以下将引发相同的错误
a = [1, 2]
puts a['test']
在你的情况下,我怀疑 json_response
或 json_response['data']
是一个数组。
另外,我相信你想使用 assert_equal
而不是 assert_no_difference
。 assert_no_difference
接受一个数值表达式和一个块;并断言该块执行前后表达式相同。 https://api.rubyonrails.org/v7.0.2.2/classes/ActiveSupport/Testing/Assertions.html#method-i-assert_no_difference