2016-02-29 43 views
0

我正在学习JavaScript和Jasmine-Node我已经成功通过了前11个匹配器。但我似乎无法通过这种方式来比较匹配器,我已经查找了所有我能想到的方法来克服它。我被卡住了。我真的很感谢一些帮助,并且对我的代码的一般评论也是受欢迎的。JavaScript代码不通过Jasmine toThrow测试

这里是规范测试...

var Triangle = require('./triangle'); 

describe('Triangle', function() { 

    it('equilateral triangles have equal sides', function() { 
    var triangle = new Triangle(2,2,2); 
    expect(triangle.kind()).toEqual('equilateral'); 
    }); 

    it('larger equilateral triangles also have equal sides', function() { 
    var triangle = new Triangle(10,10,10); 
    expect(triangle.kind()).toEqual('equilateral'); 
    }); 

    it('isosceles triangles have last two sides equal', function() { 
    var triangle = new Triangle(3,4,4); 
    expect(triangle.kind()).toEqual('isosceles'); 
    }); 

    it('isosceles trianges have first and last sides equal', function() { 
    var triangle = new Triangle(4,3,4); 
    expect(triangle.kind()).toEqual('isosceles'); 
    }); 

    it('isosceles triangles have two first sides equal', function() { 
    var triangle = new Triangle(4,4,3); 
    expect(triangle.kind()).toEqual('isosceles'); 
    }); 

    it('isosceles triangles have in fact exactly two sides equal', function() { 
    var triangle = new Triangle(10,10,2); 
    expect(triangle.kind()).toEqual('isosceles'); 
    }); 

    it('scalene triangles have no equal sides', function() { 
    var triangle = new Triangle(3,4,5); 
    expect(triangle.kind()).toEqual('scalene'); 
    }); 

    it('scalene triangles have no equal sides at a larger scale too', function() { 
    var triangle = new Triangle(10,11,12); 
    expect(triangle.kind()).toEqual('scalene'); 
    }); 

    it('scalene triangles have no equal sides in descending order either', function() { 
    var triangle = new Triangle(5,4,2); 
    expect(triangle.kind()).toEqual('scalene'); 
    }); 

    it('very small triangles are legal', function() { 
    var triangle = new Triangle(0.4,0.6,0.3); 
    expect(triangle.kind()).toEqual('scalene'); 
    }); 

    it('test triangles with no size are illegal', function() { 
    var triangle = new Triangle(0,0,0); 
    expect(triangle.kind.bind(triangle)).toThrow(); 
    }); 

    xit('triangles with negative sides are illegal', function() { 
    var triangle = new Triangle(3,4,-5); 
    expect(triangle.kind.bind(triangle)).toThrow(); 
    }); 

    xit('triangles violating triangle inequality are illegal', function() { 
    var triangle = new Triangle(1,1,3); 
    expect(triangle.kind.bind(triangle)).toThrow(); 
    }); 

    xit('edge cases of triangle inequality are in fact legal', function() { 
    var triangle = new Triangle(2,4,2); 
    expect(triangle.kind.bind(triangle)).not.toThrow(); 
    }); 

    xit('triangles violating triangle inequality are illegal 2', function() { 
    var triangle = new Triangle(7,3,2); 
    expect(triangle.kind.bind(triangle)).toThrow(); 
    }); 

    xit('triangles violating triangle inequality are illegal 3', function() { 
    var triangle = new Triangle(10,1,3); 
    expect(triangle.kind.bind(triangle)).toThrow(); 
    }); 

}); 

这是我的JavaScript ...

function Triangle(sideA, sideB, sideC) { 

    this.kind = function() { 
     // 
     // Your solution to the exercise goes here 
     // 
     var triangleType = ""; 
     if (this.isValidTriangle()){ 
     if (sideA == sideB && sideB == sideC) { 
      triangleType="equilateral"; 
     } 
     else if (sideA == sideB || sideB == sideC || sideA == sideC) { 
      triangleType="isosceles"; 
     } 
     else { 
     triangleType="scalene"; 
     } 
     } 
     else { 
//   throw new Error('Invalid Triangle'); 
//   throw TypeError("Invalid Triangle"); 
//   throw "up"; 
      throw new RangeError("Test"); 
      } 
     return triangleType;  
    }; 
    this.isValidTriangle = function() { 
     var sides = [sideA, sideB, sideC]; 
     for(var i = 0; i < sides.length; i++) { 
      if(sides[i] = 0) {i = 3; return false;}; 
     }; 
     return true; 
    }; 
}; 

module.exports = Triangle; 

这是茉莉花输出...

c:\Users\EP\exercism\javascript>jasmine-node triangle --verbose 

Triangle - 20 ms 
    equilateral triangles have equal sides - 16 ms 
    larger equilateral triangles also have equal sides - 1 ms 
    isosceles triangles have last two sides equal - 0 ms 
    isosceles trianges have first and last sides equal - 0 ms 
    isosceles triangles have two first sides equal - 0 ms 
    isosceles triangles have in fact exactly two sides equal - 0 ms 
    scalene triangles have no equal sides - 0 ms 
    scalene triangles have no equal sides at a larger scale too - 0 ms 
    scalene triangles have no equal sides in descending order either - 0 ms 
    very small triangles are legal - 0 ms 
    test triangles with no size are illegal - 1 ms 

Failures: 

    1) Triangle test triangles with no size are illegal 
    Message: 
    Expected function to throw an exception. 
    Stacktrace: 
    Error: Expected function to throw an exception. 
    at null.<anonymous> (C:\Users\EP\exercism\javascript\triangle\triangle.spec.js:57:42) 

Finished in 0.053 seconds 
11 tests, 11 assertions, 1 failure, 0 skipped 

我知道我肯定错过了什么。我已经阅读了Jasmine doc,JavaScript doc,MDN,使用了它,并且似乎无法确定我做错了什么。

更新:从stackoverflow社区的一些帮助我能够克服这个问题。下面是一个通过了所有的匹配器(那些被挂起(XIT)的最终代码都被激活(它)。再次

function Triangle(sideA, sideB, sideC) { 

    this.kind = function() { 
     // 
     // Your solution to the exercise goes here 
     // 
     if (this.isValidTriangle() == false){ throw new TypeError("Invalid Triangle");} 
     else if (sideA == sideB && sideB == sideC) { 
     triangleType="equilateral"; 
     } 
     else if (sideA == sideB || sideB == sideC || sideA == sideC) { 
     triangleType="isosceles"; 
     } 
     else { 
     triangleType="scalene"; 
     } 
     return triangleType; 
    }; 

    this.isValidTriangle = function() { 
     // no triangle inequality 
     if(sideA + sideB < sideC) {return false;} 
     if(sideB + sideC < sideA) {return false;} 
     if(sideA + sideC < sideB) {return false;}  
     // no zero or negative sides 
     var sides = [sideA, sideB, sideC]; 
     for(var i = 0; i < 3; i++) { 
      if(sides[i] <= 0) {i = 3; return false;}; 
     }; 
     return true; 
    }; 
} 
module.exports = Triangle; 

感谢所有谁与他们的回答帮我!

+0

JavaScript代码用于规范中描述的练习。也就是说,我不应该改变规范,而是一个接一个地写JavaScript来通过每个测试。我正在进行将所有零点传递给三角函数的测试。我已经阅读了两个答案,但仍然发现自己迷失了方向。随意为我贬低它,我真的想明白为什么它不起作用。我试着看着底层的Jasmine代码,我的脑袋正在旋转。 –

回答

0

绑定方法返回一个函数语句,你不能指望函数语句抛出在执行它之前有一个例外。如果您想更改上下文并同时执行该功能,则需要使用applycall

+0

我还是有点迷路。我在上面添加了一条评论,以澄清我的JS代码是为了一项练习而编写的,以逐个通过规范中的测试。所以我假设有一种方法,使用规范,通过当前测试(所有边都为零)。我一直在读狂,但似乎仍然迷失。随时为我贬低它,我不会被侮辱。 Thx为您的时间! –

+0

你的意思是说,茉莉花测试应该是原样,你不能改变它们? – nstoitsev

+0

是的,这是正确的。 –

0

原因驻留在您直接调用该方法的事实,这将创建一个JavaScript错误,你需要传递将由茉莉调用的回调......这使得茉莉花赶上你的错误:

describe("Something throws",() => { 
    it("foo is not defined",() => { 
    expect(() => { foo + 5 }).toThrow(); 

    // instead of: 
    // expect(foo + 5).toThrow(); 
    }); 
}); 
+0

我正在写JS代码作为练习的一部分,我需要逐个传递规范中的匹配器。我仍然有点失落,所以随时为我贬低一个答案,我不会受到侮辱,我真的很想学习。 Thx 4你的时间! –

相关问题