单元测试Void方法调用另一个void,启动Task()

时间:2015-05-11 15:42:38

标签: c# unit-testing testing visual-studio-2013

我正在为下面的代码编写一些单元测试的建议。除了实现(它不是我的代码,但我已被委托追溯为它编写一些测试)有人会建议我如何测试它吗?我没有使用nUnit或类似的框架;我正在使用Visual Studio内置的测试工具。

我对编写单元测试相当新,但我想我至少应测试以下内容:

  • 传递给SaveFormBrokerResponse()方法
  • 的有效回复
  • 测试catch()
  • 引发的有效例外情况
  • 测试已启动的Task,但不确定如何执行此操作

我已经剥离了这个功能,主要是与实例化和一些对象的填充:

public void SaveResponse(IForm form, bool isLive, HttpRequestBase request)
{
    try
    {
        var response = new FormBrokerResponses();
        // Initialize some vars on response

        using (var memory = new MemoryStream())
        {
            var serializer = new DataContractSerializer(typeof(FormKeyValue[]));
            serializer.WriteObject(memory, request.Form.AllKeys.Select(r => new FormKeyValue(r, request.Form[r])).ToArray());
            memory.Flush();
            memory.Seek(0, SeekOrigin.Begin);
            response.Values = Encoding.UTF8.GetString(memory.ToArray());
        }

        _dataHandler.SaveFormBrokerResponses(response);
    }
    catch (Exception ex)
    {
        throw new Exception("boom explosions");
    }

    Task.Factory.StartNew(() => DispatchFormResponseViaEmail(form, isLive, request.Form.AllKeys.ToDictionary(r => r, r => (object)request.Form[r])));
}

我意识到测试void实现是棘手和可疑的,并且这里有一些集成测试问题,但是说我不能(当前)改变实现并需要为我编写测试有

1 个答案:

答案 0 :(得分:4)

你做不到。您已经创建了一个方法来触发异步操作,然后不会向调用者公开任何观察该操作的完成/结果的方法。有很多方法可以执行此操作(返回任务,接受回调,事件等),但是您需要为调用者执行某些以便能够观察异步操作的结果。如果该方法没有暴露任何东西,那么调用者就无法可靠地做任何事情。