正如标题所提到的,我正在尝试围绕自定义冲突解决引擎编写一些测试,但是在使沙发床复制发挥作用时遇到了一些麻烦。
[Test]
public async Task TestSyncReplicationAsync()
{
bool replicationAttempted = false;
bool replicationSuccess = false;
_secondPull.Changed += (sender, e) =>
{
switch (e.Status)
{
case ReplicationStatus.Idle:
replicationSuccess = CheckDocumentReplicatedToSecondDatabase();
replicationAttempted = true;
break;
case ReplicationStatus.Active:
var a = 1;
break;
case ReplicationStatus.Offline:
var b = 2;
break;
case ReplicationStatus.Stopped:
var c = 3;
break;
default:
break;
}
};
var freshDoc = _firstDb.GetDocument(_testRecordId);
freshDoc.PutProperties(new Dictionary<string, object>() {
{"name", "Phil"},
{"age", "40"},
{"type", "person"}
});
await Task.Run(() =>
{
while (!replicationAttempted)
{
Debug.WriteLine("Spinning waiting for pull");
}
});
Assert.True(replicationSuccess, "Record was not replicated successfully");
}
复制工作正常,但我通过在一个模拟器中运行两个存储桶来实现同步,因此简单地说,在第一个存储桶中创建一条记录,等待第二个复制对象,_secondPull
的状态更改,然后评估是否它有新的记录。
这是我正在运行的测试的第一个也是最基本的,即使记录确实同步了。更改的事件未触发,因此我无法完成测试?异步while循环只是保持测试代码有效。我直接获得了不同的成功:
while(_firstPush.Status == ReplicationStatus.Active)
{
//DoNothing
}
while(_secondPull.Status == ReplicationStatus.Active)
{
//DoNothing
}
///CarryOnTest
但是,这不会带来重复的成功,而且很难看。有时调试器会无限旋转,而有时它会卡住并杀死VS2013。
我不相信我会丢失任何东西,但遗憾的是缺少CB文档...
尚不清楚如何将事件处理程序连接到“ Changed”事件。如果要用于分隔Couchbase Lite实例,则需要确保您订阅了正确的Couchbase Lite实例以进行更改。
您可以在订阅更改的事件的位置共享代码吗?
更新:这是一个代码片段,可在同一应用程序中将文档从一个CB Lite实例复制到另一个实例。在这种情况下是WPF应用。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Initialize();
}
private void Initialize()
{
var cb1 = Manager.SharedInstance.GetDatabase("cb1");
cb1.Changed += Cb1_Changed;
var cb2 = Manager.SharedInstance.GetDatabase("cb2");
cb2.Changed += Cb2_Changed;
string url = "http://try-cb.cloudapp.net:4984/sync_gateway/";
var auth = new Couchbase.Lite.Auth.BasicAuthenticator("couchbase", "letmein");
var push = cb1.CreatePushReplication(new Uri(url));
push.Continuous = true;
push.Authenticator = auth;
push.Start();
var pull = cb2.CreatePullReplication(new Uri(url));
pull.Continuous = true;
pull.Authenticator = auth;
pull.Start();
}
private void Cb2_Changed(object sender, DatabaseChangeEventArgs e)
{
var cb2 = Manager.SharedInstance.GetDatabase("cb2");
var docs = e.Changes
.Select(id => cb2.GetDocument(id.DocumentId))
.ToList();
Debugger.Break();
}
private void Cb1_Changed(object sender, DatabaseChangeEventArgs e)
{
}
private void button_Click(object sender, RoutedEventArgs e)
{
var cb1 = Manager.SharedInstance.GetDatabase("cb1");
var doc = cb1.CreateDocument();
var props = doc.UserProperties != null ? doc.Properties : new Dictionary<string, object>();
props["doc"] = new
{
type = "test",
guid = Guid.NewGuid().ToString()
};
doc.PutProperties(props);
}
}