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']

到目前为止我尝试了什么

您遇到的错误

TypeError: no implicit conversion of String into Integer

通常是由于试图通过字符串索引从数组中获取值引起的。例如,以下将引发相同的错误

a = [1, 2]
puts a['test']

在你的情况下,我怀疑 json_responsejson_response['data'] 是一个数组。

另外,我相信你想使用 assert_equal 而不是 assert_no_differenceassert_no_difference 接受一个数值表达式和一个块;并断言该块执行前后表达式相同。 https://api.rubyonrails.org/v7.0.2.2/classes/ActiveSupport/Testing/Assertions.html#method-i-assert_no_difference