正如标题所提到的那样,我试图围绕我的自定义冲突解决引擎编写一些测试,但是我在使用couchbase复制来玩球时遇到了一些麻烦。
[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
&#39 ; s状态改变,然后评估它是否获得新记录。
这是我正在运行的第一个也是最基本的测试,但即使记录确实同步。改变的事件没有解雇,因此我无法完成测试?异步while循环只是为了保持测试代码的活跃性。我直接获得了成功并取得了成功:
while(_firstPush.Status == ReplicationStatus.Active)
{
//DoNothing
}
while(_secondPull.Status == ReplicationStatus.Active)
{
//DoNothing
}
///CarryOnTest
然而,这并没有给予反复的成功,而且它很难受。有时调试器只是无限旋转,有时它只会卡住并杀死VS2013。
我不相信我遗漏了任何东西,但遗憾的是CB文件缺乏......
答案 0 :(得分:0)
有点不清楚你是如何将你的事件处理程序连接到&#34;更改&#34;事件。如果您用来分隔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);
}
}