本文整理汇总了C#中Microsoft.WindowsAzure.MobileServices.Test.MobileServiceLocalStoreMock类的典型用法代码示例。如果您正苦于以下问题:C# MobileServiceLocalStoreMock类的具体用法?C# MobileServiceLocalStoreMock怎么用?C# MobileServiceLocalStoreMock使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
MobileServiceLocalStoreMock类属于Microsoft.WindowsAzure.MobileServices.Test命名空间,在下文中一共展示了MobileServiceLocalStoreMock类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: PullAsync_Cancels_WhenCancellationTokenIsCancelled
public async Task PullAsync_Cancels_WhenCancellationTokenIsCancelled()
{
var store = new MobileServiceLocalStoreMock();
var handler = new MobileServiceSyncHandlerMock();
handler.TableOperationAction = op => Task.Delay(TimeSpan.MaxValue).ContinueWith<JObject>(t => null); // long slow operation
var hijack = new TestHttpHandler();
hijack.OnSendingRequest = async req =>
{
await Task.Delay(1000);
return req;
};
IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack);
await service.SyncContext.InitializeAsync(store, handler);
IMobileServiceSyncTable table = service.GetSyncTable("someTable");
using (var cts = new CancellationTokenSource())
{
Task pullTask = table.PullAsync(null, null, null, cancellationToken: cts.Token);
cts.Cancel();
var ex = await ThrowsAsync<Exception>(() => pullTask);
Assert.IsTrue((ex is OperationCanceledException || ex is TaskCanceledException));
Assert.AreEqual(pullTask.Status, TaskStatus.Canceled);
}
}
示例2: PushAsync_ExecutesThePendingOperations_InOrder
public async Task PushAsync_ExecutesThePendingOperations_InOrder()
{
var hijack = new TestHttpHandler();
IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack);
var store = new MobileServiceLocalStoreMock();
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
IMobileServiceSyncTable table = service.GetSyncTable("someTable");
JObject item1 = new JObject() { { "id", "abc" } }, item2 = new JObject() { { "id", "def" } };
await table.InsertAsync(item1);
await table.InsertAsync(item2);
Assert.AreEqual(hijack.Requests.Count, 0);
// create a new service to test that operations are loaded from store
hijack = new TestHttpHandler();
hijack.AddResponseContent("{\"id\":\"abc\",\"String\":\"Hey\"}");
hijack.AddResponseContent("{\"id\":\"def\",\"String\":\"What\"}");
service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
Assert.AreEqual(hijack.Requests.Count, 0);
await service.SyncContext.PushAsync();
Assert.AreEqual(hijack.Requests.Count, 2);
Assert.AreEqual(hijack.RequestContents[0], item1.ToString(Formatting.None));
Assert.AreEqual(hijack.Requests[0].Headers.GetValues("X-ZUMO-FEATURES").First(), "TU,OL");
Assert.AreEqual(hijack.RequestContents[1], item2.ToString(Formatting.None));
Assert.AreEqual(hijack.Requests[1].Headers.GetValues("X-ZUMO-FEATURES").First(), "TU,OL");
// create yet another service to make sure the old items were purged from queue
hijack = new TestHttpHandler();
hijack.AddResponseContent("{\"id\":\"abc\",\"String\":\"Hey\"}");
service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
Assert.AreEqual(hijack.Requests.Count, 0);
await service.SyncContext.PushAsync();
Assert.AreEqual(hijack.Requests.Count, 0);
}
示例3: PullAsync_Cancels_WhenCancellationTokenIsCancelled
public async Task PullAsync_Cancels_WhenCancellationTokenIsCancelled()
{
var store = new MobileServiceLocalStoreMock();
var handler = new MobileServiceSyncHandlerMock();
handler.TableOperationAction = op => Task.Delay(TimeSpan.MaxValue).ContinueWith<JObject>(t => null); // long slow operation
IMobileServiceClient service = new MobileServiceClient("http://www.test.com", "secret...");
await service.SyncContext.InitializeAsync(store, handler);
IMobileServiceSyncTable table = service.GetSyncTable("someTable");
using (var cts = new CancellationTokenSource())
{
// now pull
Task pullTask = table.PullAsync(null, null, null, cancellationToken: cts.Token);
cts.Cancel();
var ex = await ThrowsAsync<Exception>(() => pullTask);
Assert.IsTrue((ex is OperationCanceledException || ex is TaskCanceledException));
Assert.AreEqual(pullTask.Status, TaskStatus.Canceled);
}
}
示例4: PurgeAsync_Throws_WhenThereIsOperationInTable_AndForceIsTrue_AndQueryIsSpecified
public async Task PurgeAsync_Throws_WhenThereIsOperationInTable_AndForceIsTrue_AndQueryIsSpecified()
{
var hijack = new TestHttpHandler();
hijack.SetResponseContent("{\"id\":\"abc\",\"String\":\"Hey\"}");
var store = new MobileServiceLocalStoreMock();
IMobileServiceClient service = new MobileServiceClient("http://www.test.com", "secret...", hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
// insert an item but don't push
IMobileServiceSyncTable table = service.GetSyncTable("someTable");
await table.InsertAsync(new JObject() { { "id", "abc" } });
Assert.AreEqual(store.TableMap[table.TableName].Count, 1); // item is inserted
// this should trigger a push
var ex = await ThrowsAsync<InvalidOperationException>(() => table.PurgeAsync(null, "$filter=a eq b", true, CancellationToken.None));
Assert.AreEqual(ex.Message, "The table cannot be purged because it has pending operations.");
Assert.AreEqual(service.SyncContext.PendingOperations, 1L); // operation still in queue
}
示例5: PurgeAsync_DeletesOperations_WhenThereIsOperationInTable_AndForceIsTrue
public async Task PurgeAsync_DeletesOperations_WhenThereIsOperationInTable_AndForceIsTrue()
{
var hijack = new TestHttpHandler();
hijack.SetResponseContent("{\"id\":\"abc\",\"String\":\"Hey\"}");
var store = new MobileServiceLocalStoreMock();
IMobileServiceClient service = new MobileServiceClient("http://www.test.com", "secret...", hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
// put a dummy delta token
string deltaKey = "deltaToken|someTable|abc";
store.TableMap[MobileServiceLocalSystemTables.Config] = new Dictionary<string, JObject>() { { deltaKey, new JObject() } };
// insert an item but don't push
IMobileServiceSyncTable table = service.GetSyncTable("someTable");
await table.InsertAsync(new JObject() { { "id", "abc" } });
Assert.AreEqual(store.TableMap[table.TableName].Count, 1); // item is inserted
Assert.AreEqual(service.SyncContext.PendingOperations, 1L);
await table.PurgeAsync("abc", null, force: true, cancellationToken: CancellationToken.None);
Assert.AreEqual(store.TableMap[table.TableName].Count, 0); // item is deleted
Assert.AreEqual(service.SyncContext.PendingOperations, 0L); // operation is also removed
// deleted delta token
Assert.IsFalse(store.TableMap[MobileServiceLocalSystemTables.Config].ContainsKey(deltaKey));
}
示例6: PushAsync_ExecutesThePendingOperations_InOrder_BatchedOne
public async Task PushAsync_ExecutesThePendingOperations_InOrder_BatchedOne()
{
var hijack = new TestHttpHandler();
IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack);
var store = new MobileServiceLocalStoreMock();
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
IMobileServiceSyncTable table = service.GetSyncTable("someTable");
JObject item1 = new JObject() { { "id", "abc" } }, item2 = new JObject() { { "id", "def" } };
await table.InsertAsync(item1);
await table.InsertAsync(item2);
Assert.AreEqual(hijack.Requests.Count, 0);
// create a new service to test that operations are loaded from store
hijack = new TestHttpHandler();
var content = new MultipartContent("mixed", "6f078995-ef2a-4617-a4c9-5d8746b26d32");
var response = new HttpResponseMessage(HttpStatusCode.OK) {
Content = new StringContent("{\"id\":\"abc\",\"String\":\"Hey\"}", Encoding.UTF8, "application/json")
};
content.Add(new HttpMessageContent(response));
hijack.AddResponseContent(content);
content = new MultipartContent("mixed", "6f078995-ef2a-4617-a4c9-5d8746b26d32");
response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent("{\"id\":\"def\",\"String\":\"What\"}", Encoding.UTF8, "application/json")
};
content.Add(new HttpMessageContent(response));
hijack.AddResponseContent(content);
service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
service.SyncContext.BatchApiEndpoint = "batch";
service.SyncContext.BatchSize = 1;
Assert.AreEqual(hijack.Requests.Count, 0);
await service.SyncContext.PushAsync();
Assert.AreEqual(hijack.Requests.Count, 2);
Assert.IsTrue(hijack.RequestContents[0].Contains(item1.ToString(Formatting.None)));
Assert.IsTrue(hijack.RequestContents[0].Contains("X-ZUMO-FEATURES: TU,OL"));
Assert.IsTrue(hijack.RequestContents[1].Contains(item2.ToString(Formatting.None)));
Assert.IsTrue(hijack.RequestContents[1].Contains("X-ZUMO-FEATURES: TU,OL"));
// create yet another service to make sure the old items were purged from queue
hijack = new TestHttpHandler();
hijack.AddResponseContent("{\"id\":\"abc\",\"String\":\"Hey\"}");
service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
Assert.AreEqual(hijack.Requests.Count, 0);
await service.SyncContext.PushAsync();
Assert.AreEqual(hijack.Requests.Count, 0);
}
示例7: PullAsync_UsesSkipAndTakeThenFollowsLinkThenUsesSkipAndTake
public async Task PullAsync_UsesSkipAndTakeThenFollowsLinkThenUsesSkipAndTake()
{
var hijack = new TestHttpHandler();
// first page
hijack.AddResponseContent("[{\"id\":\"abc\",\"String\":\"Hey\"},{\"id\":\"def\",\"String\":\"How\"}]");
// second page with a link
hijack.AddResponseContent("[{\"id\":\"ghi\",\"String\":\"Are\"},{\"id\":\"jkl\",\"String\":\"You\"}]");
hijack.Responses[1].Headers.Add("Link", "http://localhost:31475/tables/Green?$top=1&$select=Text%2CDone%2CId&$skip=2; rel=next");
// forth page without link
hijack.AddResponseContent("[{\"id\":\"mno\",\"String\":\"Mr\"},{\"id\":\"pqr\",\"String\":\"X\"}]");
// last page
hijack.AddResponseContent("[]");
var store = new MobileServiceLocalStoreMock();
IMobileServiceClient service = new MobileServiceClient("http://www.test.com", "secret...", hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
IMobileServiceSyncTable<ToDoWithStringId> table = service.GetSyncTable<ToDoWithStringId>();
Assert.IsFalse(store.TableMap.ContainsKey("stringId_test_table"));
await table.PullAsync(null, table.Take(51).Skip(3));
Assert.AreEqual(store.TableMap["stringId_test_table"].Count, 6);
Assert.AreEqual(store.TableMap["stringId_test_table"]["abc"].Value<string>("String"), "Hey");
Assert.AreEqual(store.TableMap["stringId_test_table"]["def"].Value<string>("String"), "How");
Assert.AreEqual(store.TableMap["stringId_test_table"]["ghi"].Value<string>("String"), "Are");
Assert.AreEqual(store.TableMap["stringId_test_table"]["jkl"].Value<string>("String"), "You");
Assert.AreEqual(store.TableMap["stringId_test_table"]["mno"].Value<string>("String"), "Mr");
Assert.AreEqual(store.TableMap["stringId_test_table"]["pqr"].Value<string>("String"), "X");
AssertEx.MatchUris(hijack.Requests, "http://www.test.com/tables/stringId_test_table?$skip=3&$top=50&__includeDeleted=true&__systemproperties=__version%2C__deleted",
"http://www.test.com/tables/stringId_test_table?$skip=5&$top=49&__includeDeleted=true&__systemproperties=__version%2C__deleted",
"http://localhost:31475/tables/Green?$top=1&$select=Text%2CDone%2CId&$skip=2",
"http://www.test.com/tables/stringId_test_table?$skip=9&$top=45&__includeDeleted=true&__systemproperties=__version%2C__deleted");
}
示例8: UpdateOperationAsync_UpsertTheItemInOperation_AndDeletesTheError
public async Task UpdateOperationAsync_UpsertTheItemInOperation_AndDeletesTheError()
{
var client = new MobileServiceClient("http://www.test.com");
var store = new MobileServiceLocalStoreMock();
var context = new MobileServiceSyncContext(client);
await context.InitializeAsync(store);
string operationId = "abc";
string itemId = "def";
string tableName = "test";
var item = new JObject() { { "id", itemId }, { "name", "unknown" } };
store.TableMap[MobileServiceLocalSystemTables.SyncErrors] = new Dictionary<string, JObject>() { { operationId, new JObject() { { "id", operationId }, { "version", 1 } } } };
store.TableMap[MobileServiceLocalSystemTables.OperationQueue].Add(operationId, new JObject() { { "id", operationId }, { "version", 1 }, { "item", item.ToString() }, { "kind", (int)MobileServiceTableOperationKind.Delete } });
// operation exists before cancel
Assert.IsNotNull(await store.LookupAsync(MobileServiceLocalSystemTables.OperationQueue, operationId));
// item does not exist
Assert.IsNull(await store.LookupAsync(tableName, itemId));
var error = new MobileServiceTableOperationError(operationId,
1,
MobileServiceTableOperationKind.Delete,
HttpStatusCode.PreconditionFailed,
tableName,
item: new JObject() { { "id", itemId } },
rawResult: "{}",
result: new JObject());
var item2 = new JObject() { { "id", itemId }, { "name", "unknown" }, { "version", 2 } };
await context.UpdateOperationAsync(error, item2);
var operation = await store.LookupAsync(MobileServiceLocalSystemTables.OperationQueue, operationId);
// operation is updated
Assert.IsNotNull(operation);
// error is deleted
Assert.IsNull(await store.LookupAsync(MobileServiceLocalSystemTables.SyncErrors, operationId));
Assert.AreEqual(operation.GetValue("item").ToString(), item2.ToString(Formatting.None));
}
示例9: TestOperationModifiedException
private async Task TestOperationModifiedException(bool operationExists, Func<MobileServiceTableOperationError, MobileServiceSyncContext, Task> action, String errorMessage)
{
var client = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp);
var store = new MobileServiceLocalStoreMock();
var context = new MobileServiceSyncContext(client);
await context.InitializeAsync(store);
string operationId = "abc";
string itemId = "def";
string tableName = "test";
if (operationExists)
{
store.TableMap[MobileServiceLocalSystemTables.OperationQueue].Add(operationId, new JObject() { { "version", 3 } });
}
else
{
// operation exists before cancel
Assert.IsNull(await store.LookupAsync(MobileServiceLocalSystemTables.OperationQueue, operationId));
}
var error = new MobileServiceTableOperationError(operationId,
1,
MobileServiceTableOperationKind.Update,
HttpStatusCode.Conflict,
tableName,
item: new JObject() { { "id", itemId } },
rawResult: "{}",
result: new JObject());
var ex = await ThrowsAsync<InvalidOperationException>(() => action(error, context));
Assert.AreEqual(ex.Message, errorMessage);
}
示例10: PushAsync_ReplaysStoredErrors_IfTheyAreInStore
public async Task PushAsync_ReplaysStoredErrors_IfTheyAreInStore()
{
var error = new MobileServiceTableOperationError("abc",
1,
MobileServiceTableOperationKind.Update,
HttpStatusCode.PreconditionFailed,
"test",
new JObject(),
"{}",
new JObject());
var store = new MobileServiceLocalStoreMock();
await store.UpsertAsync(MobileServiceLocalSystemTables.SyncErrors, error.Serialize(), fromServer: false);
var hijack = new TestHttpHandler();
IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
var ex = await ThrowsAsync<MobileServicePushFailedException>(service.SyncContext.PushAsync);
}
示例11: PullAsync_Supports_AbsoluteAndRelativeUri
public async Task PullAsync_Supports_AbsoluteAndRelativeUri()
{
var data = new string[]
{
"http://www.test.com/api/todoitem",
"/api/todoitem"
};
foreach (string uri in data)
{
var hijack = new TestHttpHandler();
hijack.AddResponseContent("[{\"id\":\"abc\",\"String\":\"Hey\"},{\"id\":\"def\",\"String\":\"How\"}]"); // first page
hijack.AddResponseContent("[]");
var store = new MobileServiceLocalStoreMock();
IMobileServiceClient service = new MobileServiceClient("http://www.test.com", "secret...", hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
IMobileServiceSyncTable<ToDoWithStringId> table = service.GetSyncTable<ToDoWithStringId>();
Assert.IsFalse(store.TableMap.ContainsKey("stringId_test_table"));
await table.PullAsync(null, uri);
Assert.AreEqual(store.TableMap["stringId_test_table"].Count, 2);
AssertEx.MatchUris(hijack.Requests, "http://www.test.com/api/todoitem?$skip=0&$top=50&__includeDeleted=true&__systemproperties=__version%2C__deleted",
"http://www.test.com/api/todoitem?$skip=2&$top=50&__includeDeleted=true&__systemproperties=__version%2C__deleted");
Assert.AreEqual("QS,OL", hijack.Requests[0].Headers.GetValues("X-ZUMO-FEATURES").First());
Assert.AreEqual("QS,OL", hijack.Requests[1].Headers.GetValues("X-ZUMO-FEATURES").First());
}
}
示例12: PullAsync_Incremental_MovesByUpdatedAt_ThenUsesSkipAndTop_WhenUpdatedAtDoesNotChange
public async Task PullAsync_Incremental_MovesByUpdatedAt_ThenUsesSkipAndTop_WhenUpdatedAtDoesNotChange()
{
var hijack = new TestHttpHandler();
hijack.OnSendingRequest = req =>
{
return Task.FromResult(req);
};
hijack.AddResponseContent(@"[{""id"":""abc"",""String"":""Hey"", ""__updatedAt"": ""2001-02-03T00:00:00.0000000+00:00""}]");
hijack.AddResponseContent(@"[{""id"":""def"",""String"":""World"", ""__updatedAt"": ""2001-02-03T00:00:00.0000000+00:00""}]");
hijack.AddResponseContent("[]"); // last page
var store = new MobileServiceLocalStoreMock();
IMobileServiceClient service = new MobileServiceClient("http://www.test.com", "secret...", hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
IMobileServiceSyncTable<ToDoWithStringId> table = service.GetSyncTable<ToDoWithStringId>();
await table.PullAsync("items", table.CreateQuery());
AssertEx.MatchUris(hijack.Requests,
"http://www.test.com/tables/stringId_test_table?$filter=(__updatedAt ge datetimeoffset'1970-01-01T00:00:00.0000000%2B00:00')&$orderby=__updatedAt&$skip=0&$top=50&__includeDeleted=true&__systemproperties=__updatedAt%2C__version%2C__deleted",
"http://www.test.com/tables/stringId_test_table?$filter=(__updatedAt ge datetimeoffset'2001-02-03T00:00:00.0000000%2B00:00')&$orderby=__updatedAt&$skip=0&$top=50&__includeDeleted=true&__systemproperties=__updatedAt%2C__version%2C__deleted",
"http://www.test.com/tables/stringId_test_table?$filter=(__updatedAt ge datetimeoffset'2001-02-03T00:00:00.0000000%2B00:00')&$orderby=__updatedAt&$skip=1&$top=50&__includeDeleted=true&__systemproperties=__updatedAt%2C__version%2C__deleted");
}
示例13: PullAsync_DoesNotPurge_WhenItemIsMissing
public async Task PullAsync_DoesNotPurge_WhenItemIsMissing()
{
var hijack = new TestHttpHandler();
hijack.AddResponseContent("{\"id\":\"abc\",\"String\":\"Hey\"}"); // for insert
hijack.AddResponseContent("[{\"id\":\"def\",\"String\":\"World\"}]"); // remote item
hijack.AddResponseContent("[]"); // last page
var store = new MobileServiceLocalStoreMock();
IMobileServiceClient service = new MobileServiceClient("http://www.test.com", "secret...", hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
IMobileServiceSyncTable table = service.GetSyncTable("someTable");
await table.InsertAsync(new JObject() { { "id", "abc" } }); // insert an item
await service.SyncContext.PushAsync(); // push to clear the queue
// now pull
await table.PullAsync(null, null);
Assert.AreEqual(store.TableMap[table.TableName].Count, 2); // 1 from remote and 1 from local
Assert.AreEqual(hijack.Requests.Count, 3); // one for push and 2 for pull
}
示例14: PullAsync_Succeeds
public async Task PullAsync_Succeeds()
{
var hijack = new TestHttpHandler();
hijack.OnSendingRequest = req =>
{
return Task.FromResult(req);
};
hijack.AddResponseContent("[{\"id\":\"abc\",\"String\":\"Hey\"},{\"id\":\"def\",\"String\":\"World\"}]"); // for pull
hijack.AddResponseContent("[]"); // last page
var store = new MobileServiceLocalStoreMock();
IMobileServiceClient service = new MobileServiceClient("http://www.test.com", "secret...", hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
IMobileServiceSyncTable<ToDoWithStringId> table = service.GetSyncTable<ToDoWithStringId>();
var query = table.Skip(5)
.Take(3)
.Where(t => t.String == "world")
.OrderBy(o => o.Id)
.WithParameters(new Dictionary<string, string>() { { "param1", "val1" } })
.OrderByDescending(o => o.String)
.IncludeTotalCount();
await table.PullAsync(null, query, cancellationToken: CancellationToken.None);
Assert.AreEqual(hijack.Requests.Count, 2);
AssertEx.QueryEquals(hijack.Requests[0].RequestUri.Query, "?$filter=(String%20eq%20'world')&$orderby=String%20desc,id&$skip=5&$top=3¶m1=val1&__includeDeleted=true&__systemproperties=__version%2C__deleted");
}
示例15: PullAsync_Throws_WhenPushThrows
public async Task PullAsync_Throws_WhenPushThrows()
{
var hijack = new TestHttpHandler();
hijack.Responses.Add(new HttpResponseMessage(HttpStatusCode.NotFound)); // for push
var store = new MobileServiceLocalStoreMock();
IMobileServiceClient service = new MobileServiceClient("http://www.test.com", "secret...", hijack);
await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
// insert an item but don't push
IMobileServiceSyncTable table = service.GetSyncTable("someTable");
await table.InsertAsync(new JObject() { { "id", "abc" } });
Assert.AreEqual(store.TableMap[table.TableName].Count, 1); // item is inserted
// this should trigger a push
var ex = await ThrowsAsync<MobileServicePushFailedException>(() => table.PullAsync(null, null));
Assert.AreEqual(ex.PushResult.Errors.Count(), 1);
Assert.AreEqual(hijack.Requests.Count, 1); // 1 for push
}