我正在寻找一些有关为下面代码编写一些单元测试的建议。除了实现(这不是我的代码),但我被任命为追溯为其编写一些测试),有人可以建议我如何测试吗?我不使用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,而不是启动任务。然后,您可以测试实际上调用此方法,测试例外等。