2017-07-28 62 views
0

我正在寫一個程序來測試不同的三角形類型,我卡住了。這是我對我的測試:茉莉花Tdd第一次嘗試

(留下評論思考過程)。

APP-spec.js

describe("Answer", function() { 
    var equilateral; 
    var sideA; 
    var sideB; 
    var sideC; 
    it("Should return equilateral when all sides are equal", function() { 
     expect(whichTriangle(sideA, sideB, sideC).toEqual(sideA, sideB, sideC)); 
     // expect (sideA).tobe(sideB); 
     // expect (sideB).tobe(sideC); 
     // expect (sideC).tobe(sideA); 
     // !expect (sideA, sideB, sideC).tobe(undefined); 
    }); 
    it("Should return isosceles when 2 sides are equal", function() { 
     // let sideD: number; 
     // let sideE: number; 
     // let sideF: number; 
     expect(sideA).tobe((sideB)); 
     expect(sideB).tobe((sideC)); 
     !expect(sideA, sideB, sideC).toEqual(sideA, sideB, sideC); 
    }); 
    it("Should return scalene when no sides are equal", function() { 
     // let sideG: number; 
     // let sideH: number; 
     // let sideI: number; 
     !expect(sideA).tobe(sideB); 
     !expect(sideB).tobe(sideC); 
     !expect(sideC).tobe(sideA); 
    }); 
}); 
describe("Isosceles triangle", function() { 
    var isosceles; 
}); 

這是我有我的app.js文件:

app.js

function whichTriangle(sideA, sideB, sideC) { 
    // let side1 = document.getElementById('sideA').value(); 
    // let side2 = document.getElementById('sideB').value(); 
    // let side3 = document.getElementById('sideC').value(); 
    if (side1 === side2 && side3) { 
     console.log("triangle is Equilateral"); 
    } 
    else if (side1 === side2 && side1 != side3) { 
     console.log("triangle is an isosceles"); 
    } 
    else if (side1 != side2 && side1 != side3 && side2 != side3) { 
     console.log('triangle is a scalene'); 
    } 
    else if (side1 === null || side1 === undefined || 
     side2 === null || side2 === undefined || 
     side3 === null || side3 === undefined) { 
     console.log('You must enter a number for all 3 sides'); 
    } 
    else { 
     console.log('You got me I don\'t know what this shape is. Maybe a rectangle?'); 
    } 
} 
equalSides(1, 1, 1); 

這是我收到的時候我運行應用程序:

Jasmine Spec Runner

3 specs, 3 failures 
Spec List | Failures 
Answer Should return equilateral when all sides are equal 
TypeError: Cannot read property 'value' of null 
TypeError: Cannot read property 'value' of null 
    at equalSides (http://localhost:63342/greater%20sum%20test/src/app.js:2:49) 
    at Object.<anonymous> (http://localhost:63342/greater%20sum%20test/spec/app-spec.js:7:16) 
    at attemptSync (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3898:24) 
    at QueueRunner.run (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3887:9) 
    at QueueRunner.execute (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3872:10) 
    at Spec.queueRunnerFactory (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:816:35) 
    at Spec.execute (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:473:10) 
    at Object.fn (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:4975:37) 
    at attemptAsync (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3945:24) 
    at QueueRunner.run (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3884:9) 
Answer Should return isosceles when 2 sides are equal 
TypeError: expect(...).tobe is not a function 
TypeError: expect(...).tobe is not a function 
    at Object.<anonymous> (http://localhost:63342/greater%20sum%20test/spec/app-spec.js:17:23) 
    at attemptSync (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3898:24) 
    at QueueRunner.run (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3887:9) 
    at QueueRunner.execute (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3872:10) 
    at Spec.queueRunnerFactory (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:816:35) 
    at Spec.execute (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:473:10) 
    at Object.fn (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:4975:37) 
    at attemptAsync (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3945:24) 
    at QueueRunner.run (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3884:9) 
    at http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3924:18 
Answer Should return scalene when no sides are equal 
TypeError: expect(...).tobe is not a function 
TypeError: expect(...).tobe is not a function 
    at Object.<anonymous> (http://localhost:63342/greater%20sum%20test/spec/app-spec.js:25:24) 
    at attemptSync (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3898:24) 
    at QueueRunner.run (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3887:9) 
    at QueueRunner.execute (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3872:10) 
    at Spec.queueRunnerFactory (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:816:35) 
    at Spec.execute (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:473:10) 
    at Object.fn (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:4975:37) 
    at attemptAsync (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3945:24) 
    at QueueRunner.run (http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3884:9) 
    at http://localhost:63342/greater%20sum%20test/lib/jasmine-2.6.4/jasmine.js:3924:18 

當然,我知道我做錯了什麼,但任何在正確的方向微調是非常讚賞和批評是值得歡迎的。

回答

1

它需要是toBe而不是tobe。我也注意到你正試圖說not通過使用!這是行不通的。你需要做expect(something).not.toBe(somethingElse)

看起來你已經知道爲什麼你有前2個錯誤(文檔選擇器)。

這些是你的代碼拋出錯誤的原因。儘管您的單元測試和您的測試功能需要仔細重新考慮。你的單位正在描述函數的返回值應該是描述三角形的字符串。然而,你的函數不會返回一個字符串,它會打印到控制檯。如果你的函數返回「Equilateral」,「Isosceles」或「Scalene」,那會更好。

function whichTriangle(sideA, sideB, sideC) { 
    // let side1 = document.getElementById('sideA').value(); 
    // let side2 = document.getElementById('sideB').value(); 
    // let side3 = document.getElementById('sideC').value(); 
    if (side1 === side2 && side1 === side3) { 
     console.log("triangle is Equilateral"); 
     return 'Equilateral'; 
    } 
    else if (side1 === side2 && side1 != side3) { 
     console.log("triangle is an isosceles"); 
     return 'Isosceles'; 
    } 
    else if (side1 != side2 && side1 != side3 && side2 != side3) { 
     console.log('triangle is a scalene'); 
     return 'Scalene'; 
    } 
    else if (side1 === null || side1 === undefined || 
     side2 === null || side2 === undefined || 
     side3 === null || side3 === undefined) { 
     console.log('You must enter a number for all 3 sides'); 
    } 
    else { 
     console.log('You got me I don\'t know what this shape is. Maybe a rectangle?'); 
    } 
    throw new Error('Not a triangle'); 
} 

每個測試應該嘗試你的函數正確的返回值,所以你必須:

it("Should return equilateral when all sides are equal", function() { 
    expect(whichTriangle(1, 1, 1)).toBe('Equilateral'); 
}); 
it("Should return isosceles when 2 sides are equal", function() { 
    expect(whichTriangle(1, 2, 1)).toBe('Isosceles'); 
}); 
it("Should return scalene when no sides are equal", function() { 
    expect(whichTriangle(1, 2, 3)).toBe('Scalene'); 
}); 

然而,還是有自己的函數中的一個錯誤,請注意:

side1 === side2 && side3 

並不意味着所有的三面都是平等的。它應該是:

side1 === side2 && side1 === side3 //or side2 === side3 

這就是爲什麼您還要進行其他測試!

it("Should not return equilateral when all sides are not equal", function() { 
    expect(whichTriangle(1, 1, 2)).not.toBe('Equilateral'); 
    expect(whichTriangle(2, 1, 2)).not.toBe('Equilateral'); 
    expect(whichTriangle(2, 3, 2)).not.toBe('Equilateral'); 
}); 
it("Should not return isosceles when 3 sides are equal or none are equal", function() { 
    expect(whichTriangle(2, 2, 2)).not.toBe('Isosceles'); 
    expect(whichTriangle(3, 2, 1)).not.toBe('Isosceles'); 
}); 
it("Should not return scalene there's at least one side equal", function() { 
    expect(whichTriangle(1, 1, 2)).not.toBe('Scalene'); 
    expect(whichTriangle(1, 2, 1)).not.toBe('Scalene'); 
    expect(whichTriangle(2, 1, 1)).not.toBe('Scalene'); 
    expect(whichTriangle(2, 2, 2)).not.toBe('Scalene'); 
}); 
+0

太謝謝你了。我正在使用!其原因是我的IDE(webStorm)將其改爲!當我輸入_.not.toBe_,所以我想也許這是我不知道的新東西,並將其留下。我會做出改變並繼續努力。再次感謝你。 –

+0

@PerryCraft,我加了一些'not'的例子 – MinusFour

+0

哇,這很好,寫得很好,非常感謝你。可能是我回歸的最好的解釋答案。謝謝 –

1

第一個問題,我看到的是該行:

expect(whichTriangle(sideA, sideB, sideC).toEqual(sideA, sideB, sideC)); 

應該看起來像這樣:

expect(whichTriangle(sideA, sideB, sideC)).toEqual(sideA, sideB, sideC); 

下一個,功能whichTriangle總是返回未定義的,所以你的測試看起來像這樣:期望(未定義).toEqual(某物)。

例如,當你想測試,如果函數返回正確的值,你可以做到這一點是這樣的:

const foo = function() { 
    return 10; 
} 

it('should return 10', function() { 
    expect(foo()).toEqual(10); 
}) 
+0

感謝您的期望改變將會繼續發揮作用。我應該在一天前問過,但我想努力把它挖掘到我的大腦中。 –