Как установить возвращаемое значение объекта MS Fakes?
Я сгенерировал код клиента OData с OData V4 Client Code Generator
, Сгенерированный код не может быть проверен модулем без MS Fakes, поэтому я сгенерировал поддельную сборку из него. Теперь у меня есть проблема, как на самом деле установить возвращаемое значение методов.
Класс "core" в сгенерированном коде называется System
:
[global::Microsoft.OData.Client.OriginalNameAttribute("System")]
public partial class System : global::Microsoft.OData.Client.DataServiceContext
{
/// <summary>
/// Initialize a new System object.
/// </summary>
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.OData.Client.Design.T4", "2.4.0")]
public System(global::System.Uri serviceRoot) :
base(serviceRoot, global::Microsoft.OData.Client.ODataProtocolVersion.V4)
{
this.ResolveName = new global::System.Func<global::System.Type, string>(this.ResolveNameFromType);
this.ResolveType = new global::System.Func<string, global::System.Type>(this.ResolveTypeFromName);
this.OnContextCreated();
this.Format.LoadServiceModel = GeneratedEdmModel.GetInstance;
this.Format.UseJson();
}
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.OData.Client.Design.T4", "2.4.0")]
[global::Microsoft.OData.Client.OriginalNameAttribute("salesorders")]
public global::Microsoft.OData.Client.DataServiceQuery<Salesorder> Salesorders
{
get
{
if ((this._Salesorders == null))
{
this._Salesorders = base.CreateQuery<Salesorder>("salesorders");
}
return this._Salesorders;
}
}
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.OData.Client.Design.T4", "2.4.0")]
private global::Microsoft.OData.Client.DataServiceQuery<Salesorder> _Salesorders;
... continues from here and contains all the strongly typed classes...
}
Теперь, как вы можете видеть собственность Salesorders
является DataServiceQuery<Salesorder>
который принимает выражение Linq в качестве параметра.
Я пытался задать запрос вручную, но он не работает, а также кажется немного избыточным указывать фактический запрос в тестовом примере. По сути, все, что мне нужно, - это метод для возврата List (или Enumrable), как если бы я мог использовать Moq.
РЕДАКТИРОВАТЬ: Я нашел старую статью об использовании Fakes с более старым генератором кода CRM, но это не очень мне помогает в этом случае ( https://zhongchenzhou.wordpress.com/2012/07/10/dynamics-crm-2011-unit-test-part-2-microsoft-fakes-with-linq-query)
_client = new ODataClient.Microsoft.Dynamics.CRM.Fakes.StubSystem(new System.Uri(...
_dao = new DataAccess.DataAccess(_client);
using (ShimsContext.Create())
{
var query = from a in _client.Salesorders select a;
ODataClient.Microsoft.Dynamics.CRM.Fakes.ShimSystem.AllInstances.SalesordersGet = (c) =>
{
return new Microsoft.OData.Client.DataServiceQuery<Salesorder>( // how?
};
// This fails _dao.GetSalesordersByAccountAndContactId(Guid.NewGuid().ToString(), Guid.NewGuid().ToString());
}
1 ответ
using (ShimsContext.Create())
{
var client = new ODataClient.Microsoft.Dynamics.CRM.Fakes.ShimSystem();
IDataAccess dao = new DataAccess.DataAccess(client);
var salesorders = new List<Salesorder>
{
new Salesorder()
};
IQueryable<Salesorder> queryableData = salesorders.AsQueryable();
var queryShim = new Microsoft.OData.Client.Fakes.ShimDataServiceQuery<Salesorder>();
queryShim.ExpressionGet = () => queryableData.Expression;
queryShim.ElementTypeGet = () => queryableData.ElementType;
queryShim.ProviderGet = () => queryableData.Provider;
queryShim.GetEnumerator = () => queryableData.GetEnumerator();
DataClient.Microsoft.Dynamics.CRM.Fakes.ShimSystem.SalesordersGet = () => queryShim;
}