使用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)'
答案 0 :(得分:3)
instance_of
用于参数匹配:
something.should_receive(:foo).with(instance_of(String))
您可以使用==
而不是include
运算符。例如:
JSON.parse(body).should include('uuid', 'name' => 'New Device', 'type' => 'Device')
表示密钥uuid
必须包含任何值,name
和type
应与指定值一起出现。它还允许哈希中的其他键。
我不知道如何通过内置匹配器实现您的要求。