C# 如何模拟任务<&燃气轮机;结果如何?
我正在设置一些单元测试,并使用Rhino Mock来填充正在测试的对象。模拟的内容之一是C# 如何模拟任务<&燃气轮机;结果如何?,c#,task-parallel-library,rhino-mocks,C#,Task Parallel Library,Rhino Mocks,我正在设置一些单元测试,并使用Rhino Mock来填充正在测试的对象。模拟的内容之一是任务,因为测试的逻辑包括调用HttpClient,以获得异步响应 所以我开始像这样设置模拟: var httpClient = MockRepository.GenerateMock<HttpClient>(); var taskFunc = MockRepository.GenerateMock<Func<HttpResponseMessage>>(); var resp
任务
,因为测试的逻辑包括调用HttpClient
,以获得异步响应
所以我开始像这样设置模拟:
var httpClient = MockRepository.GenerateMock<HttpClient>();
var taskFunc = MockRepository.GenerateMock<Func<HttpResponseMessage>>();
var responseTask = MockRepository.GenerateMock<Task<HttpResponseMessage>>(taskFunc);
var response = MockRepository.GenerateMock<HttpResponseMessage>();
httpClient.Stub(c => c.PostAsJsonAsync<IEnumerable<LogMessage>>(Arg<string>.Is.Anything, Arg<IEnumerable<LogMessage>>.Is.Anything)).Return(responseTask);
responseTask.Stub(t => t.Result).Return(response);
response.Stub(r => r.IsSuccessStatusCode).Return(true);
我对Rhino Mock或C#async没有太多经验,所以我可能忽略了一些显而易见的东西。当然,目标是对.Result
属性的任何调用都将返回响应
模拟。但看起来我的尝试本身可能正在调用.Result
,我希望它无限期地等待,因为它可能只是一个模拟
正确的安排方式是什么?本质上,我需要为我的对象提供一个模拟的
HttpClient
,并断言使用特定参数对其调用了一个方法。最简单的事情就是返回一个已完成的任务,并返回预期的结果:
var responseTask = Task.FromResult(response);
我想挂起的原因是模拟任务从未启动,因此给定的func没有运行。您可以在测试中启动它:
var responseTask = MockRepository.GenerateMock<Task<HttpResponseMessage>>(taskFunc);
responseTask.Start();
var responseTask=MockRepository.GenerateMock(taskFunc);
responseTask.Start();
但是,没有理由模拟任务,因为您可以轻松地直接创建已完成/失败/取消的任务。大约一年前,我使用MOQ对任务进行了大量模拟。除非我错了,否则您只需要替换传递到模拟响应任务中的taskFunc。然后让那个模拟函数立即返回一个响应。@Keith:有趣。所以只需创建一个真正的
Func
,而不是一个只返回值的mock?我只是这样试过:Func taskFunc=delegate(){return response;}
并将该taskFunc
传递给responseTask
mock,但观察到相同的行为。我认为您不需要实际的mock任务。您需要模拟的是传递到任务中的函数,因此它将只返回“x”。看起来就是这样。有了这个,我还需要通过后两个Stub()
调用来删除。(.Result
由您的答案处理,.IsSuccessStatusCode
在尝试存根时抛出错误,但在模拟中似乎默认为true
)。谢谢!
var responseTask = MockRepository.GenerateMock<Task<HttpResponseMessage>>(taskFunc);
responseTask.Start();