2014-12-06 75 views
1

我已经在Javascript中使用Date()编写了自己的实现,BardyDate除了Date的所有属性/方法外还有其他一些东西。为什么我这样做确实是一个非常好的问题,但这是一个漫长的故事,我将在下雨天保存它。Javascript日期测试工具

但我在想可能会是能够验证它仍然行为正确的日期。我对测试套件等一无所知,但想知道如何将Javascript日期对象的任何现有测试应用到我的BardyDate以显示正确性?

任何建议非常欢迎。

+1

d[dateFunction]()重复日期的方法,和呼叫与日期相同的方法,看到它们产生相同的输出。您将需要比较日期的字符串版本,因为2个对象永远不会相等。 – dandavis 2014-12-06 23:38:54

回答

0

我等待回应,因为我不确定没有日期测试套件已经在那里的JavaScript。我想给任何可能知道更多的人带来怀疑。

但是,据我所知,这种测试将全部在浏览器构建/验证中完成。当然可以使用该开发领域的一些现有测试套件,但我认为这不是一件容易的任务。许多浏览器都有一个build process that you could fork(特别是你可以隔离他们的日期测试用例)。在他们的测试过程中,你将不得不为Javascript日期对象找到给定的段,这将测试以确保w3规范的兼容性。

那么,Selenium是创建单元测试的非常常用和实用的方法,并且如果设计良好的web应用程序集成测试(也可以连接到javascript)并且能够生成有关测试结果的良好报告。

最后,累积性职位上的JavaScript测试库可以在this post about Javascript TDD (Test Driven Design)

找到或者你可以做类似下面的(意味着是一个指引不是一个完整的解决方案 - 从dandavis评论启发):

var epochTS = 0; 
var bd = new BardyDate(epochTS); 
var d = new Date(epochTS); 

Object.getOwnPropertyNames(Date.prototype).forEach(function(dateFunction){ 
    //in this if statement you are testing the functions like getTime() and getYear() 
    if(dateFunction.indexOf("get") == 0){ 
     console.log("dateFunction " + dateFunction + 
      "() pass: " + (bd[dateFunction]() === d[dateFunction]())) 
    } 
    //in this if statement you are testing the functions like toString() and toJSON() 
    if(dateFunction.indexOf("to") == 0){ 
     console.log("dateFunction " + dateFunction + 
      "() pass: " + (bd[dateFunction]() === d[dateFunction]())) 
    } 
    //then there are the 16 set methods, those you probably would want to hardcode. 
    //unless you are content with passing a hard coded value in like "10" -- the 
    //issue would be bounds testing, which you would likely want to hardcode. 
    //beyond the scope of this for-each loop. 
}) 

在上面的代码做一点解释

随着Object.getOwnPropertNames(Date.prototype)您可以获取012所有方法,尽管Date有财产DontEnumsee this post for more info)。

你也可以将每个函数的字符串作为JavaScript对象中的一个关键,因此这要是dateFunction === "toString"会被解释/编译成d[toString]()这相当于d.toString()