有人可以解释这对同步方法意味着什么吗?如果我尝试改变方法async然后VS抱怨它.
这有效:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我想知道这究竟是什么意思: Task.FromResult<object>(null);
假设我有以下类和它依赖的接口:
public class MyController
{
private IRepository _repository;
public MyController(IRepository repository)
{
_repository = repository;
}
public async Task MethodUnderTest(int someId)
{
var o = await _repository.FindById(someId);
// update o
await _repository.Commit();
}
}
public interface IRepository
{
Task Commit();
}
Run Code Online (Sandbox Code Playgroud)
当我对这个方法进行单元测试时,我可以执行以下操作(使用xUnit和Rhino Mocks):
[Fact]
public async Task MyTest()
{
IRepository repositoryStub = MockRepository.GenerateStub<IRepository>();
MyController controller = new MyController(repositoryStub);
await controller.MethodUnderTest(1);
}
Run Code Online (Sandbox Code Playgroud)
这会因System.NullReferenceException而失败:对象引用未设置为对象的实例.
使用以下StackTrace:
UnitTest.MyController.<MethodUnderTest>d__0.MoveNext() in
\UnitTest\Class1.cs:line 35
--- End of stack trace from previous location where …Run Code Online (Sandbox Code Playgroud) 如果我尝试模拟包含如下async方法的类型:
interface Foo
{
Task<int> Bar();
}
Run Code Online (Sandbox Code Playgroud)
然后mock的Bar方法返回null.我猜Moq正在选择default(Task<int>)我的方法的默认返回值,这确实是null.然而,Moq应该选择像Task.FromResult(default(int))默认值这样的东西.我可以强制Moq使异步方法返回非空任务吗?
我无法理解为什么以下代码不起作用:
var task = new Task(() => { });
task.Start();
if (task.Wait(10000))
{
logger.Info("Works");
}
else
{
logger.Info("Doesn't work");
}
Run Code Online (Sandbox Code Playgroud)
超时到期后,任务状态停留在"正在运行",尽管没有任何事情要做.更换task.Start()同task.RunSynchronously()但是会工作.
有没有人知道我可能做错了什么?
可以在此处找到复制该问题的测试项目:http://erwinmayer.com/dl/TaskTestProject.zip.据我所知,如果具有上述代码的方法在静态构造函数中运行,则它不起作用.但是如果直接作为静态类方法调用它就可以工作.
最近这篇MSDN博客文章似乎突出了静态构造函数的相关问题:http://blogs.msdn.com/b/pfxteam/archive/2011/05/03/10159682.aspx
我有以下NUnit测试类:
[TestFixture]
public class Tests
{
async Task<string> GetMessageAsync()
{
return "Hello from GetMessageAsync!";
}
Task<string> GetMessageTask()
{
return new Task<string>(() => "Hello from GetMessageTask!");
}
[Test]
public async void AwaitAsyncMethod()
{
Assert.AreEqual("Hello from GetMessageAsync!", await GetMessageAsync());
}
[Test]
public async void AwaitTaskMethod()
{
Assert.AreEqual("Hello from GetMessageTask!", await GetMessageTask());
}
}
Run Code Online (Sandbox Code Playgroud)
第一个测试AwaitAsyncMethod()在执行后立即成功完成.第二个测试AwaitTaskMethod()永远不会完成.但它确实编译.
为什么第二次测试永远不会完成?为什么我可以针对非异步方法编译await,如果看起来它实际上不起作用?让我们说出于某种原因,我想要一个非异步方法来返回一个可以等待的任务 - 如何更改此代码来实现这一目标?
c# ×5
async-await ×4
asynchronous ×2
.net ×1
c#-5.0 ×1
mocking ×1
moq ×1
unit-testing ×1
wpf ×1