我想为我的应用编写单元测试,模拟复制过程中的冲突。有没有办法只使用一个CouchDB数据库和服务器来模拟冲突?
答案 0 :(得分:5)
我假设您想要在数据库中获取包含冲突的文档,而不是409冲突响应?
因此,使用已知的_id:
在数据库中创建文档$ curl http://localhost:5984/scratch/foo -X PUT -H "Content-Type: application/json" -d '{}'
{"ok":true,"id":"foo","rev":"1-967a00dff5e02add41819138abb3284d"}
然后使用批量文档API和all_or_nothing:true选项来更新同一个文档,故意为坏或没有_rev,添加一些不同的文档属性以便进行测量:
$ curl http://localhost:5984/scratch/_bulk_docs -X POST -H "Content-Type: application/json" -d '{"all_or_nothing": true, "docs": [{"_id": "foo", "abc": 123}]}'
[{"id":"foo","rev":"1-15c813a2b4b312c6915821b01a1986c5"}]
然后您应该在文档中发生冲突:
$ curl http://localhost:5984/scratch/foo?conflicts=true
{"_id":"foo","_rev":"1-967a00dff5e02add41819138abb3284d","_conflicts":["1-15c813a2b4b312c6915821b01a1986c5"]}
您还可以使用?new_edits=false
described by CouchDB committer Randall Leeds执行常规查询。
$ curl http://localhost:5984/scratch?new_edits=false -X POST -H "Content-Type: application/json" -d '{"_id": "foo", "abc": 123}'
答案 1 :(得分:1)
在提出问题后进一步搜索,看起来答案是使用批量文档API的all-or-nothing
模式。
http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API
看看页面的末尾。
答案 2 :(得分:0)
只需发布具有相同_id属性的两个文档。这会产生冲突,因为第二个doc将不包含正确的_rev属性。请记住,您需要在每个后续帖子中包含最新的_rev属性,以便CouchDB知道您是最新的。
此外,您可以在同一台服务器上创建两个数据库,并在这些数据库之间进行复制。