使用rspec,有没有办法比较两个我不知道值是多少的散列?我试过使用instance_of,但似乎不起作用。
在我的测试中,我正在创建一个带有post请求的新设备对象,并希望确保得到正确的json响应。它正在为设备创建一个uuid(我没有使用关系数据库),但我显然不知道这个值是什么,也不在乎。

post "/projects/1/devices.json", name: 'New Device'

expected = {'name' => 'New Device', 'uuid' => instance_of(String), 'type' => 'Device'}

JSON.parse(body).should == expected

我得到以下错误:
 1) DevicesController API adds a new device to a project
     Failure/Error: JSON.parse(body).should == expected
       expected: {"name"=>"New Device", "uuid"=>#<RSpec::Mocks::ArgumentMatchers::InstanceOf:0x5a27147d @klass=String>, "type"=>"Device"}
            got: {"name"=>"New Device", "uuid"=>"ef773465-7cec-48fd-b2a7-f1da10d1595a", "type"=>"Device"} (using ==)
       Diff:
       @@ -1,4 +1,4 @@
        "name" => "New Device",
        "type" => "Device",
       -"uuid" => #<RSpec::Mocks::ArgumentMatchers::InstanceOf:0x5a27147d @klass=String>
       +"uuid" => "ef773465-7cec-48fd-b2a7-f1da10d1595a"
     # ./spec/api/devices_spec.rb:37:in `(root)'

最佳答案

instance_of用于参数匹配:

something.should_receive(:foo).with(instance_of(String))

您可以使用==而不是include运算符。例如:
JSON.parse(body).should include('uuid', 'name' => 'New Device', 'type' => 'Device')

这表示键uuid必须与任何值一起出现,nametype应该与指定值一起出现。它还允许散列中的其他键。
我不知道有什么方法可以达到你要求的那种内置的匹配器。

关于ruby-on-rails - 比较两个具有未知值的哈希,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13919849/

10-10 11:38