Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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# 如何测试&x27;ToListSync';使用IsFaulted、ISCancelled和IsCompleted测试用例_C#_Mocking_Task_Nunit - Fatal编程技术网

C# 如何测试&x27;ToListSync';使用IsFaulted、ISCancelled和IsCompleted测试用例

C# 如何测试&x27;ToListSync';使用IsFaulted、ISCancelled和IsCompleted测试用例,c#,mocking,task,nunit,C#,Mocking,Task,Nunit,嗨,伙计们,我有一个这样的方法: public virtual async Task StartSearch() { CancellationTokenSource = new CancellationTokenSource(); Context = ContextFactory.Create(); SearchResults = await Task.Factory.StartNew(() => { try {

嗨,伙计们,我有一个这样的方法:

public virtual async Task StartSearch()
{
    CancellationTokenSource = new CancellationTokenSource();
    Context = ContextFactory.Create();

    SearchResults = await Task.Factory.StartNew(() =>
    {
        try
        {
            IsLoading = true;

            var resultTask = GetResults().ToListAsync(CancellationTokenSource.Token);

            while (!resultTask.IsCompleted && !resultTask.IsFaulted &&
                   !CancellationTokenSource.Token.IsCancellationRequested)
                Thread.Sleep(100);

            IsLoading = false;

            if (resultTask.IsFaulted)
                throw resultTask.Exception ??
                      new Exception("Some error.");

            return resultTask.IsCompleted && !resultTask.IsCanceled ? resultTask.Result : null;
        }
        catch (Exception)
        {
            IsLoading = false;
            throw;
        }
    }, CancellationTokenSource.Token) ?? SearchResults;
}
我想知道如何模拟一个从.toListSync()方法获得的任务(包含所有IsFaulted、IsCompleted和IsCaneed字段)? 我发现它们不是虚拟的,所以我不能创建一个任务对象来简单地模拟它们。 另外一个问题是,如果我创建自己的虚拟类并模拟它进行测试,它是否会给我一些东西

你有什么建议?也许你不想嘲笑它

目前,我只是测试这个方法来检查我的方法是否会返回一些数据

编辑:

公共抽象IQueryable GetResults();
以及一些示例性实现:

public override IQueryable<dynamic> GetResults()
{
    var query = Context.Table.AsQueryable();

    query = string.IsNullOrWhiteSpace(Field)
        ? query
        : query.Where(table => table.Field.Contains(SomeFilter));

    return query.Select(
            table => new
            {
                table.Field1,
                table.Field2,
                table.Field3
            }).OrderBy(table => table.Id);
}
public覆盖IQueryable GetResults()
{
var query=Context.Table.AsQueryable();
query=string.IsNullOrWhiteSpace(字段)
查询
:query.Where(table=>table.Field.Contains(SomeFilter));
返回查询。选择(
表=>新
{
表1.1,
表1.2,
表3.3
}).OrderBy(table=>table.Id);
}

为什么要轮询由
ToListSync
返回的任务,而不只是等待它?如果你想模拟失败/取消的操作,你可以模拟调用,并在测试中使用由
task.FromException
task.FromCancelled
返回的任务。
GetResults()
方法是什么样子的?@PavelAnikhouski我已将此代码添加到原始帖子中。你可以看看这个,如何模拟
IQueryable
界面
public override IQueryable<dynamic> GetResults()
{
    var query = Context.Table.AsQueryable();

    query = string.IsNullOrWhiteSpace(Field)
        ? query
        : query.Where(table => table.Field.Contains(SomeFilter));

    return query.Select(
            table => new
            {
                table.Field1,
                table.Field2,
                table.Field3
            }).OrderBy(table => table.Id);
}