单位测试空隙方法,该方法调用另一个void,启动task()



我正在寻找一些有关为下面代码编写一些单元测试的建议。除了实现(这不是我的代码),但我被任命为追溯为其编写一些测试),有人可以建议我如何测试吗?我不使用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实施是棘手和可疑的,这里有一些集成测试问题,但这说我无法(当前)更改实现,并且需要为我拥有的内容编写测试。

你不能。您已经创建了一种发射异步操作的方法,然后不会公开任何观察该操作的完成/结果的方法。有很多方法可以做到这一点(返回任务,接受回调,事件等),但是您需要做某件事才能使呼叫者能够观察异步操作的结果。如果该方法没有暴露任何东西,那么呼叫者可以可靠地做任何事情。

如果允许您对代码进行一些修改,我将进行以下内容,这只是一个很小的更改:

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");
    }
    Dispatch(form,isLive,request);
}
virtual void Dispatch(IForm form, bool isLive, HttpRequestBase request){
    Task.Factory.StartNew(() => DispatchFormResponseViaEmail(form, isLive, request.Form.AllKeys.ToDictionary(r => r, r => (object)request.Form[r])));
}

我不知道这类是什么命名

public class UnitTestClass : DutClass{
    override Dispatch(){
        //don't do anything or set a state variable that this method was called
    }
}

然后,不用测试您测试具有不同实现的UntextClass,而不是启动任务。然后,您可以测试实际上调用此方法,测试例外等。

相关内容

最新更新