Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Angularjs中,如何更改每个测试的模拟服务?_Javascript_Angularjs_Unit Testing_Angular Services - Fatal编程技术网

Javascript 在Angularjs中,如何更改每个测试的模拟服务?

Javascript 在Angularjs中,如何更改每个测试的模拟服务?,javascript,angularjs,unit-testing,angular-services,Javascript,Angularjs,Unit Testing,Angular Services,代码示例 这可能在代码中得到更好的解释,因此我在下面包含了一个详细的抽象示例,在注释中重复了我的问题 示例摘要 例如,您模拟了一个相当复杂的模拟服务,在第一次测试中,您希望模拟服务为一个函数提供一个肯定的结果(在下面的示例中返回代码200)。在第二个测试中,您希望相同的函数返回一个否定的结果,比如500 我发现我可以简单地注入提供者并覆盖方法,但这是正确的方法吗?参见下面的“测试2” 通常这意味着不应在每个之前的中定义模拟返回值 其中一种方法是使函数返回在公共函数作用域(descripebloc

代码示例

这可能在代码中得到更好的解释,因此我在下面包含了一个详细的抽象示例,在注释中重复了我的问题

示例摘要

例如,您模拟了一个相当复杂的模拟服务,在第一次测试中,您希望模拟服务为一个函数提供一个肯定的结果(在下面的示例中返回代码200)。在第二个测试中,您希望相同的函数返回一个否定的结果,比如500

我发现我可以简单地注入提供者并覆盖方法,但这是正确的方法吗?参见下面的“测试2”


通常这意味着不应在每个之前的
中定义模拟返回值

其中一种方法是使函数返回在公共函数作用域(
descripe
block)中定义的局部变量:

局部变量有缺点。如果在下一次测试中没有错误地重新定义
createValue
,测试可能会受到交叉污染

而且,这种模拟并不能解决一项重要任务;模拟函数不会被监视

这正是Jasmine间谍应该解决的任务:

beforeEach(function () {
  module('app', { comments: jasmine.createSpyObj('comments', ['create', 'delete']) });
});
在这种情况下,
模块
应该用函数包装,因为在每次调用之前,都应该在每个
上创建一个新的间谍对象

然后就地定义返回值:

comment.create.and.returnValue(Promise.resolve(200))
comments.create();

这是伟大的-只是尝试了它,它的工作。我不完全理解它-所以我需要离开去仔细检查几次,让它在我的大脑中沉淀下来。谢谢抱歉-您能否澄清“应该用函数包装”?请注意,在第一个示例中,它是在每个(模块(…)之前的
,在第二个示例中,它是在每个(函数(){模块(…)})之前的
。两者都适用于
模块
,但后者允许在每个规范上更新
jasmine.createSpyObj(…)
,这是理想的行为。
beforeEach(function () {
  module('app', { comments: jasmine.createSpyObj('comments', ['create', 'delete']) });
});
comment.create.and.returnValue(Promise.resolve(200))
comments.create();