Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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中日期输入的单元测试处理,不考虑时区_Javascript_Unit Testing_Jasmine_Momentjs - Fatal编程技术网

JavaScript中日期输入的单元测试处理,不考虑时区

JavaScript中日期输入的单元测试处理,不考虑时区,javascript,unit-testing,jasmine,momentjs,Javascript,Unit Testing,Jasmine,Momentjs,我有一个表单,用户可以在其中输入日期,即该值以yyyy-MM-dd格式提交。当我使用字符串创建日期对象时,它假定时区是用户浏览器设置的时区–这是我想要的行为 然后,我将使用date值对一个需要ISO日期/时间字符串的RESTAPI进行查询。这没有问题,因为日期对象上的toISOString函数可以正确处理所有事情 但是,当我对该代码进行单元测试时–将输入设置为yyyy-MM-dd字符串,然后断言输出是预期的ISO时间戳字符串,测试只能在特定时区中工作。有没有办法在测试中强制时区 我试着用Jasm

我有一个表单,用户可以在其中输入日期,即
该值以
yyyy-MM-dd
格式提交。当我使用字符串创建日期对象时,它假定时区是用户浏览器设置的时区–这是我想要的行为

然后,我将使用date值对一个需要ISO日期/时间字符串的RESTAPI进行查询。这没有问题,因为日期对象上的
toISOString
函数可以正确处理所有事情

但是,当我对该代码进行单元测试时–将输入设置为
yyyy-MM-dd
字符串,然后断言输出是预期的ISO时间戳字符串,测试只能在特定时区中工作。有没有办法在测试中强制时区

我试着用Jasmine间谍做一些事情,比如:

var fixedTime = moment().zone(60).toDate()
spyOn(window, 'Date').andCallFake(function() {
    return fixedTime;
});

但是,考虑到构造函数有如此多的变体,以及它被moment.js调用的方式如此之多,这是非常不切实际的,让我陷入无限循环。

JavaScript
日期不能设置为特定时区。它只能从运行它的环境中了解UTC和计算机的本地时间

有,但我认为这对你没有帮助

首先,要理解“ISO”指的是ISO8601,这是一个定义相关格式集合的规范,例如
YYYY-MM-DDTHH:MM:SS

它是UTC的一个独立概念,UTC指的是世界协调时间。UTC是一种计时系统,我们都将时钟与之同步,它以格林尼治标准时间(GMT)为基础,即本初子午线的有效时间,不适用于夏令时

总之,
Date.toISOString()
方法将返回UTC格式的ISO8601格式的时间戳,例如
2013-09-20T01:23:45Z
。末尾的
Z
表示时间以UTC为单位

但是像
2013-09-20
这样的值仍然是ISO格式的-只是它只有全天的精度,这意味着它不能携带任何时区信息

使用
时,结果值不是
日期
类。它是一个包含ISO格式的
YYYY-MM-DD
的字符串。您应该直接将其传递给您的应用程序

现在,如果您要查找的是所选日期的完整日期和时间,在当地时区的午夜,并调整为UTC,那么情况就不同了。这当然是可行的,但你必须明白,这并不等同于仅仅传递日历日期

最简单的方法如下:

var s = "2013-09-20";  // from your input's value property
var m = moment(s);
var result = m.toISOString();  // "2013-09-20T07:00:00.000Z"
该值已调整,因为我的时区偏移为-07:00

您可以在没有时间限制的情况下执行此操作,但您必须用斜线替换破折号,否则原始值将被解释为UTC格式

new Date(s.replace('-','/')).toISOString()

为什么你不只是模仿mock moment.js?那我要测试什么呢?我的mock返回了我刚才告诉它的内容?我认为您不应该测试外部API是否按预期工作,而应该测试您的代码是否以正确的方式调用此API。我正在尝试测试我是否正确地将本地时区中的yyyy MM dd日期(用户的输入格式)转换为UTC ISO时间戳字符串(API的输入格式)。这是在测试我调用API的方式是否正确。今天学到了一些新东西。从不知道
-
/
被区别对待。