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);
}