Unit testing 在包装器函数中正确使用库的一般测试是错误的做法吗?

Unit testing 在包装器函数中正确使用库的一般测试是错误的做法吗?,unit-testing,testing,Unit Testing,Testing,我希望这个问题足够具体。我想编写一个包装器来简化项目中经常发生的get请求(用JS编写),并在底层技术发生变化时生成一个变更点。到目前为止,这个包装依赖于jQuery,我想在某个时候对其进行更改 我现在面临的问题是如何以良好的方式正确地测试包装器,以确保传入更改后的正确性。 我可能想测试的是成功解析响应的格式或长时间运行的请求的可取消性 因此,从概念上讲,我似乎(a.t.m.)想测试我是否正确使用了底层库并正确处理了提供给我的结果 这在概念上是可以接受的还是表明设计本身缺乏 (为什么我会有这个问

我希望这个问题足够具体。我想编写一个包装器来简化项目中经常发生的get请求(用JS编写),并在底层技术发生变化时生成一个变更点。到目前为止,这个包装依赖于jQuery,我想在某个时候对其进行更改

我现在面临的问题是如何以良好的方式正确地测试包装器,以确保传入更改后的正确性。 我可能想测试的是成功解析响应的格式或长时间运行的请求的可取消性

因此,从概念上讲,我似乎(a.t.m.)想测试我是否正确使用了底层库并正确处理了提供给我的结果

这在概念上是可以接受的还是表明设计本身缺乏

(为什么我会有这个问题:

我的第一种方法是在运行测试时使用模拟服务器来截获请求。因此,这需要设置模拟服务器,在我的特定用例中,模拟服务器可以很好地与“nock”配合使用,而不需要太多配置)。 在那之后,我考虑模拟包装器的内部库调用来发出实际请求。 但老实说,这似乎不太令人满意,因为这将使测试实现与实际实现紧密结合,因为在切换到另一个库时,我可能不得不重写模拟(这也是本文的最后一点)。 因此,我在问自己,我的方法本身是否在概念上被打破了。)


希望这是可以理解的,并且足够精确。

如果我理解正确,您的包装器会对应用程序的其余部分隐藏实现细节,如下图所示:App->wrapper->jQuery。现在,您担心包装器的测试是特定于jQuery的,如果您更改了该技术,则必须更改测试

至少在很大程度上,这是一种不可避免的情况,因为这实际上是包装器的全部目的:封装jQuery依赖项。如果替换jQuery,则需要重新编写包装器,或者换句话说,编写一个完全不同的包装器

您可以通过引入另一个包装器使测试更加独立于jQuery,如:App->wrapper1->wrapper2->jQuery。但是,如果您以前的包装器是一个薄层,那么在包装器1中就没有多少代码需要测试了。而且,即使您可以将包装器拆分为包装器1和包装器2,您也可以问同样的问题:如何测试包装器2,以便在更改后不必重新编写测试?好的,您可以尝试拆分包装器2:App->wrapper1->wrapper2a->wrapper2b->jQuery,这将无限地继续下去


但是,您可能有一个解决方案:您没有显示包装器的代码,但是对于包装器来说,单元测试可能不是正确的测试方法。包装器很可能主要由与jQuery的交互组成。而且,对于由与其他库的交互控制的代码,只需跳过单元测试而直接进入集成测试是有意义的。

一般来说,您应该编写易于测试的代码。如果您发现自己正在做一些事情,比如编写大量的模拟或严重依赖模拟库,那么您可能应该重新考虑您的设计。此外,您将更多的逻辑从UI推到它自己的库、类或方法中,它就越容易测试,您就越不必依赖Selenium之类的工具。我尽可能多地这样做。这实际上是我在这个项目中第一次考虑嘲弄任何东西。但是说实话,当涉及到考试时,我仍然在很多方面感到非常不安全。从这篇文章中可以看出,我甚至很难恰当地提出一个问题。这实际上是非常有洞察力和逻辑性的。谢谢