Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用Moq进行分页和排序的单元测试返回至少一个对象必须实现IComparable_C#_Linq_Unit Testing_Moq_Linq To Objects - Fatal编程技术网

C# 在C中使用Moq进行分页和排序的单元测试返回至少一个对象必须实现IComparable

C# 在C中使用Moq进行分页和排序的单元测试返回至少一个对象必须实现IComparable,c#,linq,unit-testing,moq,linq-to-objects,C#,Linq,Unit Testing,Moq,Linq To Objects,我在C#和Moq中实现了分页和排序(通过多列)。现在我想为它创建一个单元测试,但我得到了一个错误: “至少有一个对象必须实现IComparable” 我已经在日志对象中实现了IComparable,但我一直收到错误消息 我知道这个问题来自OrderBy,然后是ByDescending,等等。但是我认为在日志中实现IComparable就足以解决它了 无论如何,我只是在比较ID,但我应该能够通过sortColumns拥有的任何东西进行比较,也许每列创建一个比较器,但首先我必须知道如何使其工作 有什

我在C#和Moq中实现了分页和排序(通过多列)。现在我想为它创建一个单元测试,但我得到了一个错误:

“至少有一个对象必须实现IComparable”

我已经在日志对象中实现了IComparable,但我一直收到错误消息

我知道这个问题来自OrderBy,然后是ByDescending,等等。但是我认为在日志中实现IComparable就足以解决它了

无论如何,我只是在比较ID,但我应该能够通过sortColumns拥有的任何东西进行比较,也许每列创建一个比较器,但首先我必须知道如何使其工作

有什么建议吗

这是我的代码:

单元测试的片段。

logRepository.Setup(p => p.All()).Returns(logs.AsQueryable); 
var logService = new LogService { PrivateLoggingCatalog = catalog.Object };     
var logsReturned = logService.SearchLogs(null, null, 1, 10, new List<string>{"Message"}, new List<string>{"desc"}).Items.ToList();
logRepository.Setup(p=>p.All()).Returns(logs.AsQueryable);
var logService=newlogservice{PrivateLoggingCatalog=catalog.Object};
var logsreern=logService.SearchLogs(null,null,1,10,新列表{“Message”},新列表{“desc”});
日志服务

public class LogService : ILogService
{
    public PageOf<Log> SearchLogs(DateTime? from, DateTime? to, int pageNumber, int pageSize, IEnumerable<string> sortColumns, IEnumerable<string> sortDirections, string searchTerm = null)
    {
        var filteredData = PrivateLoggingCatalog.LogRepository.All()
                   .Where(x => (!from.HasValue || x.Date >= from)
                       && (!to.HasValue || x.Date < to));

        filteredData = FilterLogBySearchTerm(filteredData, searchTerm);

        return PageSortResult(filteredData, pageNumber, pageSize, sortColumns.ToList(), sortDirections.ToList());
    }

    private static IQueryable<T> FilterLogBySearchTerm<T>(IQueryable<T> filteredData, string searchTerm)
        where T : Log
    {
        if (!string.IsNullOrWhiteSpace(searchTerm))
        {
            filteredData = filteredData.Where(x => x.Level.Contains(searchTerm) ||
                                x.Message.ToUpper().Contains(searchTerm) ||
                                x.MachineName.ToUpper().Contains(searchTerm) ||
                                x.CallSite.ToUpper().Contains(searchTerm) ||
                                x.Exception.ToUpper().Contains(searchTerm) ||
                                x.Stacktrace.ToUpper().Contains(searchTerm) ||
                                x.ErrorClass.ToUpper().Contains(searchTerm) ||
                                x.ErrorMessage.ToUpper().Contains(searchTerm) ||
                                x.ErrorMethod.ToUpper().Contains(searchTerm) ||
                                x.ErrorSource.ToUpper().Contains(searchTerm) ||
                                x.InnerException.ToUpper().Contains(searchTerm));
        }
        return filteredData;
    }

    private static PageOf<T> PageSortResult<T>(IQueryable<T> filteredData, int pageNumber, int pageSize, IList<string> sortColumns, IList<string> sortDirections) where T : Log
    {
        IOrderedQueryable<T> items = null;

        items = sortDirections[0] == "asc"
                        ? filteredData.OrderBy(SortColumns<T>()[sortColumns.ElementAtOrDefault(0)])
                        : filteredData.OrderByDescending(SortColumns<T>()[sortColumns.ElementAtOrDefault(0)]);

        var i = 1;

        if (sortDirections.Count > 1)
        {
            sortDirections.RemoveAt(0);
            items = sortDirections.Aggregate(items, (current, sortDirection) => sortDirection == "asc" ? 
                current.ThenBy(SortColumns<T>()[sortColumns.ElementAtOrDefault(i++)]) : 
                current.ThenByDescending(SortColumns<T>()[sortColumns.ElementAtOrDefault(i++)]));
        }

        items = items.ThenByDescending(SortColumns<T>()["Id"]);

        var result = new PageOf<T>
        {
            TotalItems = filteredData.Count(),
            Items = items.Skip((pageNumber - 1) * pageSize).Take(pageSize)
        };

        return result;
    }

    static DictionaryWithDefault<string, Expression<Func<T, object>>> SortColumns<T>() where T : Log
    {
        return new DictionaryWithDefault<string, Expression<Func<T, object>>>(x => new { x.Id })
            {
                { "Id", x => new {x.Id} },
                { "Message", x => new {x.Message}},
                { "Level", x => new {x.Level}},
                { "Date", x => new {x.Date}},
                { "Logger", x => new {x.Logger}},
                { "MachineName", x => new {x.MachineName}},
                { "CallSite", x => new {x.CallSite}},
                { "Exception", x => new {x.Exception}},
                { "InnerException", x => new {x.InnerException}},
                { "Stacktrace", x => new {x.Stacktrace}},
                { "ErrorSource", x => new {x.ErrorSource}},
                { "ErrorClass", x => new {x.ErrorClass}},
                { "ErrorMethod", x => new {x.ErrorMethod}},
                { "ErrorMessage", x => new {x.ErrorMessage}}
            };
    }
公共类日志服务:ILogService
{
搜索日志的公共页面(DateTime?from,DateTime?to,int pageNumber,int pageSize,IEnumerable sortColumns,IEnumerable sortDirections,字符串searchTerm=null)
{
var filteredData=PrivateLoggingCatalog.LogRepository.All()
.其中(x=>(!from.HasValue | | x.Date>=from)
&&(!to.HasValue | | x.Datex.Level.Contains(searchTerm)||
x、 Message.ToUpper()包含(searchTerm)||
x、 MachineName.ToUpper()包含(searchTerm)||
x、 CallSite.ToUpper()包含(searchTerm)||
x、 Exception.ToUpper()包含(searchTerm)||
x、 Stacktrace.ToUpper()包含(searchTerm)||
x、 ErrorClass.ToUpper()包含(searchTerm)||
x、 ErrorMessage.ToUpper()包含(searchTerm)||
x、 ErrorMethod.ToUpper()包含(searchTerm)||
x、 ErrorSource.ToUpper()包含(searchTerm)||
x、 包含(searchTerm));
}
返回过滤器数据;
}
PageSortResult(IQueryable filteredData、int pageNumber、int pageSize、IList sortColumns、IList sortDirections)的私有静态页面,其中T:Log
{
IOrderedQueryable项=空;
items=sortDirections[0]=“asc”
?filteredData.OrderBy(SortColumns()[SortColumns.ElementAtOrderFault(0)])
:filteredData.OrderByDescending(SortColumns()[SortColumns.ElementAtOrderFault(0)];
var i=1;
如果(sortDirections.Count>1)
{
sortDirections.RemoveAt(0);
items=sortDirection.Aggregate(items,(当前,sortDirection)=>sortDirection==“asc”?
current.ThenBy(SortColumns()[SortColumns.elementAtOrderFault(i++]):
current.ThenByDescending(SortColumns()[SortColumns.elementAtOrderFault(i++]);
}
items=items.ThenByDescending(SortColumns()[“Id”]);
var结果=新页面,共页
{
TotalItems=filteredData.Count(),
Items=Items.Skip((页码-1)*页面大小)。Take(页面大小)
};
返回结果;
}
静态字典WithDefault SortColumns(),其中T:Log
{
返回newdictionaryWithDefault(x=>new{x.Id})
{
{“Id”,x=>new{x.Id},
{“Message”,x=>new{x.Message},
{“Level”,x=>new{x.Level},
{“Date”,x=>new{x.Date},
{“Logger”,x=>new{x.Logger},
{“MachineName”,x=>新的{x.MachineName},
{“CallSite”,x=>new{x.CallSite},
{“异常”,x=>new{x.Exception},
{“InnerException”,x=>new{x.InnerException},
{“Stacktrace”,x=>new{x.Stacktrace},
{“ErrorSource”,x=>new{x.ErrorSource},
{“ErrorClass”,x=>new{x.ErrorClass},
{“ErrorMethod”,x=>新的{x.ErrorMethod},
{“ErrorMessage”,x=>new{x.ErrorMessage}
};
}
Log.cs的片段

public class Log : Entity, IComparable
    {
      public int CompareTo(object other)
        {
            var log = (Log)other;
            if (this.Id > log.Id)
                return 1;

            if (this.Id < log.Id)
                return -1;

            return 0;
        }
}
公共类日志:实体,IComparable
{
公共整数比较(对象其他)
{
var log=(log)其他;
if(this.Id>log.Id)
返回1;
if(this.Id