单元测试带有HTML上下文的Javascript

时间:2013-01-10 11:37:59

标签: javascript unit-testing jasmine

我目前正在编写一个javascript游戏模块,它将以下参数作为构造函数参数:

{
  gameId : "string for unique game id",
  cssSelector: "selector for target (used to initialze game)"
 }

我找到了解决此问题的方法,请参阅下面的新评论

我对其他所有内容都有很好的测试覆盖率,但我无法弄清楚如何编写以下Jasmine测试:

describe("Initialization of game", function() {
        it("Should throw expection if css selector is not found", function() {

           // what goes here?

            //negative scenario
           expect(function(){
                          var game = new Game({gameId : '1', cssSelector : "#not-found"});
                        }).toThrow("Cannot find the element corresponding to cssSelector");

          //positive senario
           expect(function(){
                          var game = new Game({gameId : '1', cssSelector : "#found"});
                        }).not.toThrow("Cannot find the element corresponding to cssSelector");
        });

“解决方案” 我说“解决方案”,因为感觉有点像黑客来解决这个问题。我使用的事实是测试是在HTML中运行的,我可以操纵环境。所以我做的是:

  1. 在否定方案中,使用未找到的说明符。第一个期望不会失败。
  2. 在正面和负面测试用例之间,我使用jQuerys .append()方法向身体添加id为“found”的div
  3. 就是这样!

3 个答案:

答案 0 :(得分:1)

如果您需要更深入的DOM测试,Jasmine将不会单独进行测试。

对于简单的DOM要求和单一测试,您可以继续做您正在做的事情。

对于简单但重复的测试,请使用beforeEachafterEach来设置和销毁测试期间所需的DOM元素。

除了最简单的DOM测试之外,您可以使用类似:https://github.com/jeffwatkins/jasmine-dom的内容将Jasmine扩展到DOM中。

答案 1 :(得分:0)

可能是因为您错过);之后的"#not-found"}

答案 2 :(得分:0)

在jQuery中,这将有效。 如果有这样的DOM节点,它的长度将大于0。

var exists = $('cssSelector').length > 0;