Я перенес некоторый код модульного теста из официального репозитория OData.net Github, и я могу имитировать ответы на непакетные запросы GET и PATCH, но у меня возникают проблемы с имитированием пакетных запросов, содержащих операции PATCH. Ниже приведен рабочий модульный тест, имитирующий непакетированные ответы.
Код: Выделить всё
[TestMethod]
public void Update_Test()
{
DataServiceContext mockContext = new DataServiceContext(new Uri(Constants.BASE_URI));
mockContext.Format.UseJson(Utils.BuildEdmModel());
mockContext.MergeOption = MergeOption.PreserveChanges;
var salesOrdersQuery = mockContext.CreateQuery(Constants.SALES_ORDERS_SET_NAME);
// Setup a GET request to fake
string resp = Utils.LoadJsonPayload("GET_SalesOrderWithLineResp.json");
Utils.MockQueryResponse(
context: mockContext,
baseUriStr: Constants.BASE_URI,
entitySetName: Constants.SALES_ORDERS_SET_NAME,
mockResponseValue: resp
);
// GET faked order, then update
MockSalesOrder order = salesOrdersQuery.Expand(o => o.SalesOrderLines).First();
order.OrderType = "Return";
mockContext.UpdateObject(order);
// Setup a PATCH request to fake
resp = Utils.LoadJsonPayload("PATCH_SalesOrderWithLineResp.json");
Utils.MockSaveResponse(
context: mockContext,
location: string.Format("{0}/SalesOrders(OrderNo='S-ORD100000',OrderType='Order')", Constants.BASE_URI),
response: resp
);
// Fake a PATCH request
mockContext.SaveChanges();
}
Код: Выделить всё
public static void MockQueryResponse(DataServiceContext context, string baseUriStr, string entitySetName, string mockResponseValue)
{
string mockResponse = "{\"@odata.context\":\"" + baseUriStr + "/$metadata#" + entitySetName + "\",\"value\":" + mockResponseValue + "}";
context.ResolveName = (type) => $"NS.{type.Name}";
context.Configurations.RequestPipeline.OnMessageCreating = (args) =>
{
var contentTypeHeader = "application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8";
var odataVersionHeader = "4.0";
return new TestHttpWebRequestMessage(args,
new Dictionary
{
{"Content-Type", contentTypeHeader},
{"OData-Version", odataVersionHeader},
},
() => new MemoryStream(Encoding.UTF8.GetBytes(mockResponse)));
};
}
public static void MockSaveResponse(DataServiceContext context, string location, string response)
{
context.Configurations.RequestPipeline.OnMessageCreating = (args) =>
{
return new CustomizedRequestMessage(
args,
response,
new Dictionary()
{
{"Content-Type", "application/json;charset=utf-8"},
{ "Location", location },
});
};
}
Код: Выделить всё
[
{
"OrderNo": "S-ORD100000",
"OrderType": "Order",
"SampleField": "Test",
"SalesOrderLines": [
{
"OrderNo": "S-ORD100000",
"OrderType": "Order",
"LineNo": "1000",
"SampleField": "Test"
}
]
}
]
Код: Выделить всё
{
"@odata.context": "https://mock.odata.service/$metadata#SalesOrders/$entity",
"@odata.editLink": "http://https//mock.odata.service/SalesOrders(OrderNo='S-ORD100000',OrderType='Order')",
"@odata.etag": "W/\"JzE5OzY4MjIzMTYxNjY4MTkyNDY2MDgxazAwOyc=\"",
"OrderNo": "S-ORD100000",
"OrderType": "Order",
"SampleField": "Test",
"SalesOrderLines": [
{
"@odata.etag": "W/\"JzE5OzY4MjIzMTYxNjY4MTkyNDY2MDgxOzAwOyc=\"",
"OrderNo": "S-ORD100000",
"OrderType": "Order",
"LineNo": "1000",
"SampleField": "Test"
}
]
}
Код: Выделить всё
System.NotSupportedException: 'Memory stream is not expandable.'
at System.IO.__Error.MemoryStreamNotExpandable()
at System.IO.MemoryStream.set_Capacity(Int32 value)
at System.IO.MemoryStream.EnsureCapacity(Int32 value)
at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at Microsoft.OData.Client.ODataRequestMessageWrapper.SetRequestStream(ContentStream requestStreamContent)
at Microsoft.OData.Client.BatchSaveResult.BatchRequest()
at Microsoft.OData.Client.DataServiceContext.SaveChanges(SaveChangesOptions options)
Код: Выделить всё
mockContext.SaveChanges(SaveChangesOptions.BatchWithIndependentOperations | SaveChangesOptions.UseRelativeUri);
Код: Выделить всё
{
"responses": [
{
"id": "1",
"status": 200,
"headers": {
"content-type": "application/json; odata.metadata=minimal; odata.streaming=true",
"odata-version": "4.0"
},
"body": {
"@odata.context": "https://mock.odata.service/$metadata#SalesOrders/$entity",
"@odata.etag": "W/\"JzE5OzczMTExMDYxMjE3NTYxMzY5MjkxOzAwOyc=\"",
"OrderNo": "S-ORD100000",
"OrderType": "Order",
"SampleField": "Test"
}
}
]
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... icecontext
Мобильная версия