【问题标题】:How to set the return value of MS Fakes object?如何设置 MS Fakes 对象的返回值?
【发布时间】:2018-04-18 20:26:54
【问题描述】:

我已使用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...
}

现在您可以看到属性SalesordersDataServiceQuery&lt;Salesorder&gt;,它采用Linq 表达式作为参数。

我尝试手动设置查询,但它不起作用,而且在测试用例中指定实际查询似乎有点多余。基本上我所需要的只是返回一个列表(或可枚举)的方法,就像我可以使用 Moq 时那样。

编辑:我发现一篇关于在旧 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());
            }

【问题讨论】:

    标签: c# unit-testing odata microsoft-fakes


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 2019-08-30
      • 2012-10-02
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多