我有一个有两个依赖项的服务。其中一个是$ http服务,负责对我的Rest API进行Ajax调用。
在我的服务中,我有这个功能:
this.getAvailableLoginOptions = function() {
return $http.get(path.api + '/security/me/twoFA/options').then(function (resp) {
return new TwoFaLoginOptions(resp.data);
});
};
此函数从我的API获取一些选项并返回一个对象。
现在,我应该如何正确地测试这个功能?通常我只是模拟$ http服务,这样当使用以'/security/me/twoFA/options'
结尾的字符串参数调用get函数时,我将返回带有选项的有效响应。
但是,如果其他开发人员进入并重构此功能,那么现在它需要来自另一个源e.i的选项。另一个API或来自浏览器的本地存储,但该功能仍能完美运行,因为它返回它应该执行的操作。
那么真正的单元测试是什么?我们应该将每个函数都测试为一个黑盒子,并假设如果我们给出一些输入,那么我们期望一些特定的输出或者我们应该通过查看函数内的每一行代码来测试它作为一个白盒子并且模拟一切但是测试将是强烈依赖于所有依赖关系以及我如何使用它们。
是否有可能编写一个单元测试,无论使用什么算法或数据源来测试我的函数是否正常工作?或者这实际上是单元测试的一部分,以检查我的函数是否真的使用了这种和那种方式的依赖(除了测试函数的逻辑)?
答案 0 :(得分:0)
但是,如果其他开发人员进入并重构此功能,那么现在它需要来自其他来源的选项
这正是使用Dependency Injection的原因,因为它使管理对象之间的依赖关系变得简单(更容易将连贯的功能分解为单独的契约(接口)),从而解决了在交换期间交换对象依赖关系的问题运行时或编译时。)
例如,您可以拥有一个具有多个实现(服务,本地存储等)的ITwoFaLoginOptions,然后您将模拟接口get方法。
我们是否应该将每个功能测试为黑盒[...]或者我们应该测试 它是一个白色的盒子?
一般来说,单元测试被视为白盒测试(模拟您拥有的依赖项,以获取可帮助您到达各种代码路径的预定义响应,同时还断言这些已使用预期参数调用依赖项),而系统(或集成)测试将使用黑盒方法(例如,像客户端一样调用服务,断言对响应/ DB)