>

OData V4 Client Code Generator 로 OData 클라이언트 코드를 생성했습니다 . 생성 된 코드는 MS Fakes없이 단위 테스트를 할 수 없으므로 가짜 어셈블리를 생성했습니다. 이제 메소드의 반환 값을 실제로 설정하는 방법에 문제가 있습니다.

생성 된 코드에서 "핵심"클래스를 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 표현식을 매개 변수로 사용합니다.

손으로 쿼리를 설정하려고 시도했지만 작동하지 않으며 테스트 사례에서 실제 쿼리를 지정하는 것이 약간 중복되는 것처럼 보입니다. 기본적으로 필요한 것은 Moq를 사용할 수있는 것처럼 List (또는 Enumrable)를 반환하는 방법입니다.

편집 : 오래된 CRM 코드 생성기로 Fakes를 사용하는 것에 대한 오래된 기사를 찾았지만이 경우에는 도움이되지 않습니다 ( 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;
    }
    
    

관련 자료

  • 이전 javascript - 원자 적이어야하는 코드에 Promiseresolve를 적용하는 방법
  • 다음 데이터 생성을위한 C # MySQL 주입 방지