Ruby 控制硬件的TDD web api

Ruby 控制硬件的TDD web api,ruby,rspec,tdd,Ruby,Rspec,Tdd,我开发了一个gem,它封装了一个用于控制远程照明开关和调光器的capi。当我开发这个gem进行测试时,我在编译时用一些链接魔法模拟了底层的C-api,这很好,我可以在没有正确硬件的情况下在桌面上开发,等等 现在我想在另一个项目中使用这个gem来包装一个更高级别的restapi,但是我正在努力进行测试 如何在不需要硬件的情况下测试RESTAPI。在项目中,我是否应该将我的低级api作为git子模块,并使用加载路径进行修改,以便重用低级模拟 或者我应该再次模拟新项目的整个API吗?我在这里完全不知所

我开发了一个gem,它封装了一个用于控制远程照明开关和调光器的capi。当我开发这个gem进行测试时,我在编译时用一些链接魔法模拟了底层的C-api,这很好,我可以在没有正确硬件的情况下在桌面上开发,等等

现在我想在另一个项目中使用这个gem来包装一个更高级别的restapi,但是我正在努力进行测试

如何在不需要硬件的情况下测试RESTAPI。在项目中,我是否应该将我的低级api作为git子模块,并使用加载路径进行修改,以便重用低级模拟

或者我应该再次模拟新项目的整个API吗?我在这里完全不知所措


欢迎就此进行任何提示或讨论

如果我理解正确,您希望用另一层公开REST Api来包装包装C Api的相同“gem”。我说得对吗? 如果是这样,您应该模拟gem或capi,就像您模拟gem一样

“纯”TDD实践者通常建议分离最小的部分(即模拟gem),以推动SRP(单一责任原则)

另一方面,当我添加的层(本例中的RESTAPI)主要是一个包装器,并且没有太多自己的“业务逻辑”时,我个人更喜欢像集成测试一样编写测试,而不是纯粹的单元测试,以便在正确的上下文中测试新层。(即,一起测试Rest API+gem,并仅模拟C API)

如果这个restapi纯粹是一个包装器,那么您可能可以重用您的测试,方法是将它们推送到基类并派生两个子类:一个子类测试gem本身,另一个子类通过restapi测试gem。 无论如何,我总是一起重构我的测试和代码,以消除重复。有时,这会导致我改变我嘲笑的和我不嘲笑的,并改进总体设计,包括剪切和测试本身