我正在使用这个围棋库(https://github.com/abourget/goproxy)来创建一个定制的代理服务器应用程序。该应用程序使用了以下几种中间件:
MyMiddlewarFunc(ctx *goproxy.ProxyCtx) goproxy.Next {
if ctx.Req.Header.Get("If-None-Match") == "test"{
//do something
}
}现在,我正在尝试为这些中间件函数编写单元测试。以下是我可以想到的两种可能的不同方法:
func TestMyMiddlewarFunc() { ctx = &goproxy.ProxyCtx{} ctx.Req.Header.Set("If-None-Match", "test") ctx.Req.Header.Set("If-Modified-Since", "test") MyMiddlewarFunc(ctx) //verify if changes are done according to logic } Pros:这种方法似乎适用于大多数情况,编写起来很简单。缺点:有一个问题:由于ctx数据结构来自第三方,有时很难知道需要在其中设置什么样的数据才能正确地触发/执行某件事情。例如,在中间件中,我调用'ctx.DispatchResponseHandlers‘方法,但它会引发运行时错误,最可能的原因是在传递实例时设置不正确。所以,我很想知道你会选择哪种方法,为什么?一些细节来支持你的选择将是很好的。
发布于 2015-12-04 10:31:22
在我看来,1号和2号都不会给你单元测试。虽然单元测试和集成测试之间没有客观的区别,但是一个包含一些您自己的代码和一些您不拥有的代码的测试可能更多地被认为是集成。
由于Go支持一流的函数,将示例转换为支持实际单元测试的最简单方法是更改以下内容:
MyMiddlewarFunc(ctx *goproxy.ProxyCtx) goproxy.Next {
if ctx.Req.Header.Get("If-None-Match") == "test"{
//do something
}
}更像是这样的:
MyMiddlewarFunc(ctx *goproxy.ProxyCtx, doSomething func()) goproxy.Next {
if ctx.Req.Header.Get("If-None-Match") == "test"{
doSomething();
}
}现在,您可以轻松地为doSomething传入的任何函数编写一个测试,它不需要知道任何关于goproxy的信息。这可能是一个真正的单元测试(假设doSomething()相当简单)。
这并不是说您所描述的两种类型的集成测试是不可取的。事实上,你应该有一些。但是,您的目标应该是拥有更多的单元测试,而不是集成测试,因为单元测试的规模往往要好得多,并且不那么脆弱。至于您的集成测试应该是类型1还是类型2,我同意Robert的意见:1工作时使用1,2工作时使用2。
https://softwareengineering.stackexchange.com/questions/304238
复制相似问题