Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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#_Task Parallel Library_Rhino Mocks - Fatal编程技术网

C# 如何模拟任务<&燃气轮机;结果如何?

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

我正在设置一些单元测试,并使用Rhino Mock来填充正在测试的对象。模拟的内容之一是
任务
,因为测试的逻辑包括调用
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();