我有一个应用程序(epazote),一旦启动就会永远运行,但我想在它阻塞/等待直到ctrl+c被按下或被杀死之前测试一些值。这是一个小例子:http : //play.golang.org/p/t0spQRJB36package mainimport ( "fmt" "os" "os/signal")type IAddString interface { AddString(string)}type addString struct{}func (self *addString) AddString(s string) { fmt.Println(s)}func block(a IAddString, s string) { // test this a.AddString(s) // ignore this while testing block := make(chan os.Signal) signal.Notify(block, os.Interrupt, os.Kill) for { signalType := <-block switch signalType { default: signal.Stop(block) fmt.Printf("%q signal received.", signalType) os.Exit(0) } }}func main() { a := &addString{} block(a, "foo")}我想知道在测试时是否可以忽略代码的某些部分,或者如何测试这种情况,我已经实现了一个接口,在这种情况下用于测试AddString 帮助我测试某些部分但不知道如何避免“阻塞”并进行测试。有任何想法吗?更新:将代码放入Addstring另一个函数的循环中有效但仅用于测试该函数,但是如果我想进行完整的代码覆盖,我仍然需要检查/测试阻塞部分,例如如何测试它的行为是否正常当收到ctrl+c或 a 时kill -HUP,我在想可能会创建一个假的,signal.Notify但不知道如何覆盖导入的包,以防万一。
2 回答
扬帆大鱼
TA贡献1799条经验 获得超9个赞
将测试委托引入您的代码。
将您的循环提取到一个函数中,该函数接受 2 个函数作为参数:onBeginEvent 和 onEndEvent。函数签名应采用:
声明您要在测试用例中检查
可选:循环编号的计数器(因此您可以识别每个循环)。它是可选的,因为实际的委托实现可以计算它被自身调用的次数。
在循环开始时,您调用 OnBegingEvent(counter, currentState); 比您的代码完成其正常工作,最后您调用 OnEndEvent(counter, currentState); 大概你的代码已经改变了 currentState。
在生产中,您可以使用函数委托的空实现或在循环中实现 nil 检查。
您可以使用此模型根据需要对处理算法进行尽可能多的检查。假设您有 5 张支票。现在你回过头来看它并意识到这变得太难了。您创建一个接口来定义您的回调函数。这些回调函数是改变服务行为的强大方法。你再退一步,意识到接口实际上是你的“服务策略”;)
一旦你走那条路,你就会想以某种方式停止你的无限循环。如果您想在测试用例中进行严格控制,您可以采用第三个函数委托,如果需要退出循环,该委托将返回 true。共享变量是控制退出条件的选项。
这当然是比单元测试更高级别的测试,并且在复杂的服务中是必要的。
- 2 回答
- 0 关注
- 137 浏览
添加回答
举报
0/150
提交
取消