toThrow ¼ìÑéÒ»¸öº¯ÊýÊÇ·ñ»áÅ׳öÒ»¸ö´íÎó
it("toThrow¼ìÑéÒ»¸öº¯ÊýÊÇ·ñ»áÅ׳öÒ»¸ö´íÎó", function() {
var foo = function() {
return 1 + 2;
};
var bar = function() {
return a + 1;
};
expect(foo).not.toThrow();
expect(bar).toThrow();
}); |
×¢£ºdescribe¿ÉǶÌ×
xdescribe ºÍ xit£ºÂ·¹ý²»Ö´ÐУ¬½á¹û²»ÏÔʾ¡£Ïñdisplay:none¡£µã¿ØÖÆÀ¸ÖÐskippedÏÔʾ
Spy ´æ´¢º¯ÊýµÄ±»µ÷ÓÃÇé¿öºÍ²ÎÊý£¨º¯Êý¼àÊÓÆ÷£¬¼Ç¼±»µ÷ÓÃÇé¿ö£¬µ«º¯Êý²¢²»ÕæÖ´ÐУ©
describe("¶Ôspyº¯ÊýµÄ²âÊÔ", function() {
var foo, bar = null;
beforeEach(function() {
foo = {
setBar: function(value) {
bar = value;
}
};
spyOn(foo, 'setBar'); //fooΪspyº¯Êý
foo.setBar(123);
foo.setBar(456, 'another param');
});
it("²âÊÔfooº¯ÊýÊÇ·ñ±»µ÷Óùý",
function() {
expect(foo.setBar).toHaveBeenCalled();
});
it("²âÊÔfooº¯Êý±»µ÷ÓõĴÎÊý",
function() {
expect(foo.setBar.calls.length).toEqual(2);
});
it("²âÊÔfooº¯Êý±»µ÷ÓÃʱ´«ÈëµÄ²ÎÊý",
function() {
expect(foo.setBar).toHaveBeenCalledWith(123);
expect(foo.setBar).toHaveBeenCalledWith(456,
'another param');
});
it("ÉÏÒ»´Î±»µ÷ÓõIJÎÊý", function()
{
expect(foo.setBar.mostRecentCall.args[0]).toEqual(456);
});
it("ËùÓб»µ÷ÓõÄÇé¿ö´æÔÚÒ»¸öÊý×éÀï",
function() {
expect(foo.setBar.calls[0].args[0]).toEqual(123);
});
it("º¯Êý²¢Î´ÕæµÄÖ´ÐÐ", function()
{
expect(bar).toBeNull();
});
}); |
Spy addCallThrough º¯Êý¼àÊÓÆ÷£¬µ«º¯ÊýÕæµÄÖ´ÐÐ
describe("¶Ôspyº¯ÊýµÄ²âÊÔ£¬º¯ÊýÕæµÄÖ´ÐÐ", function() {
var foo, bar, fetchedBar;
beforeEach(function() {
foo = {
setBar: function(value) {
bar = value;
},
getBar: function() {
return bar;
}
};
//spyOn(foo, "setBar"); //Èç¹û¼ÓÉÏÕâ¾ä£¬setBar²»ÕæµÄÖ´ÐУ¬ºóÁ½¸öspec²»Í¨¹ý
spyOn(foo, 'getBar').andCallThrough();
foo.setBar(123);
fetchedBar = foo.getBar();
});
it("²âÊÔfooÖÐgetBarº¯ÊýÊÇ·ñ±»µ÷Óùý", function() {
expect(foo.getBar).toHaveBeenCalled();
});
it("fooÖÐsetBarº¯ÊýÕæµÄÖ´ÐÐÁË", function() {
expect(bar).toEqual(123);
});
it("fooÖÐgetBarº¯ÊýÕæµÄÖ´ÐÐÁË", function() {
expect(fetchedBar).toEqual(123);
});
}); |
Spy andReturn º¯Êý¼àÊÓÆ÷£¬º¯Êý²»ÕæµÄÖ´ÐС£Ö¸¶¨¼àÊӵĺ¯ÊýµÄ·µ»ØÖµ
describe("A spy, when faking a return value", function() {
var foo, bar, fetchedBar;
beforeEach(function() {
foo = {
setBar: function(value) {
bar = value;
},
getBar: function() {
return bar;
}
};
spyOn(foo, 'getBar').andReturn(745);
//Ö¸¶¨getBarº¯Êý·µ»Ø745
foo.setBar(123);
fetchedBar = foo.getBar();
});
it("²âÊÔfooÖÐgetBarº¯ÊýÊÇ·ñ±»µ÷Óùý",
function() {
expect(foo.getBar).toHaveBeenCalled();
});
it("²»Ó°Ïìδ±»¼àÊӵįäËüº¯Êý",
function() {
expect(bar).toEqual(123);
});
it("Ö¸¶¨µÄ·µ»ØÖµ745", function()
{
expect(fetchedBar).toEqual(745);
});
}); |
Spy addCallFake Ìæ´ú±»¼àÊӵĺ¯Êý£¬Ôº¯Êý²»Ö´ÐÐ
describe("Ìæ´ú±»¼àÊӵĺ¯Êý£¬Ôº¯Êý²»Ö´ÐÐ", function() {
var foo, bar, fetchedBar;
beforeEach(function() {
foo = {
setBar: function(value) {
bar = value;
},
getBar: function() {
alert("frostbelt");
return bar;
}
};
spyOn(foo, 'getBar').andCallFake(function()
{
return 1001;
});
foo.setBar(123);
fetchedBar = foo.getBar();
});
it("²âÊÔfooÖÐgetBarº¯ÊýÊÇ·ñ±»µ÷Óùý",
function() {
expect(foo.getBar).toHaveBeenCalled();
});
it("²»Ó°Ïìδ±»¼àÊӵįäËüº¯Êý",
function() {
expect(bar).toEqual(123);
});
it("getBar±»addCallFakeÖ¸¶¨µÄÄäÃûº¯Êý´úÌæ£¬getBar²»Ö´ÐÐ",
function() {
expect(fetchedBar).toEqual(1001);
});
}); |
Èç¹ûÄãûÓÐʲô¿É¼àÊÓµÄÓÖʵÔÚÏë¼àÊÓһϣ¬¸ÃÕ¦°ì£¿×Ô¼ºcreateÒ»¸ö±»¼àÊÓº¯Êý¡£¡£
jasmine.createSpy(functionId)
describe("×Ô¼ºÔìÒ»¸ö±»¼àÊÓº¯Êý¡£°¡£¬ÎÒÁèÂÒÁË¡£¡£", function() {
var whatAmI;
beforeEach(function() {
whatAmI = jasmine.createSpy('whatAmI');
whatAmI("I", "am",
"a", "spy");
});
it("Óиöid£¬ÊÇcreateSpyµÄ´«È뺯Êý£¬ÓÃÓÚ±¨´í",
function() {
expect(whatAmI.identity).toEqual('whatAmI')
});
it("ÊÇ·ñ±»µ÷ÓÃ", function()
{
expect(whatAmI).toHaveBeenCalled();
});
it("±»µ÷ÓõĴÎÊý", function()
{
expect(whatAmI.calls.length).toEqual(1);
});
it("±»µ÷ÓõIJÎÊý", function()
{
expect(whatAmI).toHaveBeenCalledWith("I",
"am", "a", "spy");
});
it("×î½üÒ»´Î±»µ÷ÓÃ", function()
{
expect(whatAmI.mostRecentCall.args[0]).toEqual("I");
});
}); |
ÓÐʱÐèÒª¼àÊÓÒ»¸ö¶ÔÏóµÄºÜ¶à·½·¨£¬ÓÃcreateSpyObjÌí¼Ó·½·¨Êý×é
jasmine.createSpyObj(obj, methodArray)
describe("ÓÐʱÐèÒª¼àÊÓÒ»¸ö¶ÔÏóµÄºÜ¶à¸ö·½·¨£¬ÓÃcreateSpyObjÌí¼ÓÊý×é", function() {
var tape;
beforeEach(function() {
tape = jasmine.createSpyObj('tape',
['play', 'pause', 'stop', 'rewind']);
tape.play();
tape.pause();
tape.rewind(0);
});
it("tape¶ÔÏóµÄÕâËĸö·½·¨Òѱ»¶¨Òå",
function() {
expect(tape.play).toBeDefined();
expect(tape.pause).toBeDefined();
expect(tape.stop).toBeDefined();
expect(tape.rewind).toBeDefined();
});
it("Ëĸö·½·¨ÊÇ·ñ±»µ÷ÓÃ", function()
{
expect(tape.play).toHaveBeenCalled();
expect(tape.pause).toHaveBeenCalled();
expect(tape.rewind).toHaveBeenCalled();
expect(tape.stop).not.toHaveBeenCalled();
});
it("±»µ÷ÓÃʱ´«ÈëµÄ²ÎÊý", function()
{
expect(tape.rewind).toHaveBeenCalledWith(0);
});
}); |
jasmine.any ÀàÐÍÅжϡ£instanceof
describe("ÀàÐÍÆ¥Åä", function() {
it("Ï൱ÓÚinstanceof",
function() {
expect({}).toEqual(jasmine.any(Object));
expect(12).toEqual(jasmine.any(Number));
});
it("Ò²¿ÉÒÔÓÃÓÚspy", function()
{
var foo = jasmine.createSpy('foo');
foo(12, function() {
return true
});
expect(foo).toHaveBeenCalledWith(jasmine.any(Number),
jasmine.any(Function));
//foo±»µ÷ÓÃʱµÄ²ÎÊý ÀàÐÍÅжÏ
});
}); |
jasmine.Clock.useMock() jasmine×Ô¼º¿ØÖÆÊ±¼ä£¬ÊµÏÖÒì²½µ÷ÊÔ£¬¼õÉٵȴý
jasmine.Clock.tick(n:uint) ÏòǰnºÁÃë
describe("jasmine×Ô¼º¿ØÖÆÊ±¼ä£¬ÊµÏÖÒì²½µ÷ÊÔ£¬¼õÉٵȴý", function() {
var timerCallback;
beforeEach(function() {
timerCallback = jasmine.createSpy('timerCallback');
jasmine.Clock.useMock();
});
it("setTimeout", function()
{
setTimeout(function() {
timerCallback();
}, 100);
expect(timerCallback).not.toHaveBeenCalled();
jasmine.Clock.tick(101);
expect(timerCallback).toHaveBeenCalled();
});
it("setInterval", function()
{
setInterval(function() {
timerCallback();
}, 100);
expect(timerCallback).not.toHaveBeenCalled();
jasmine.Clock.tick(101);
expect(timerCallback.callCount).toEqual(1);
jasmine.Clock.tick(50);
expect(timerCallback.callCount).toEqual(1);
jasmine.Clock.tick(50);
expect(timerCallback.callCount).toEqual(2);
});
}); |
×¢£ºÔÚÕâÖÖ»·¾³ÏÂsetTimeoutºÍsetIntervalµÄcallbackΪͬ²½µÄ£¬ÏµÍ³Ê±¼ä²»ÔÙÓ°ÏìÖ´ÐÐ
runs(function) waitsFor(function, message,
millisec) JasmineÒì²½µ÷ÊÔ °´×Ô¼ºµÄÀí½âд¸öÀý×Ó
describe("jasmineÒì²½µ÷ÊÔ£¬¶Ôajax½á¹ûµÄ¶ÏÑÔ", function(){
var data, flag = false;
it("ajaxÊÇ·ñ°´Ê±·µ»ØÁËÕýÈ·½á¹û",
function(){
runs(function(){
$.post(
url,
{},
function(data){
flag = true;
data = data.someAttr;
}
);
});
waitsFor(function(){ //flagΪtrue»òµ½2ÃëʱִÐÐ
2ÃëÄÚ·µ»ØtrueÔòÖ´ÐÐ×îºóÒ»¸öruns£¬µ½Ê±Î´·µ»ØÔò±¾spec³ö´í£¬·µ»ØµÚ¶þ¸ö²ÎÊý´íÎóÐÅÏ¢
return flag;
}, "ajaxÔÚÖ¸¶¨Ê±¼ä2ÃëÄÚδ·µ»Ø",
2000);
runs(function(){ //Ö±µ½waitsFor·µ»ØtrueʱִÐÐ
expect(data).toEqual("someThing");
})
});
}); |
×¢£ºitÊÇÒ»¸öspec£¬°üº¬
runs(function)
waitsFor(function, message, millsec)
runs(function)
|
µÚÒ»¸örunsÀïÓÐһЩÒì²½µÄ´úÂë
waitsForÖеÄfuncitonÈç¹ûÔÚmillsecÄÚ·µ»Øtrue£¬Ö´ÐÐ×îºóÒ»¸öruns
Èç¹ûÔÚmillsecÄÚ²»ÄÜ·µ»Øtrue£¬spec²»Í¨¹ý£¬ÏÔʾ´íÎóÐÅÏ¢message
e) ʹÓÃ
ÔÚ²âÊÔµÄÒ³ÃæÀï¼ÓÈëÒÔÏ´úÂ룺
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var trivialReporter = new jasmine.TrivialReporter();
jasmineEnv.addReporter(trivialReporter);
jasmineEnv.specFilter = function(spec)
{
return trivialReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script> |
µ¼Èëjasmine.css jasmine.js jasmine-html.js
src.js(Ô´´úÂë) test.js(´æ·Ådescribes)
JsTestDriver
a) ¼ò½é
JsTestDriverÊÇÒ»¸öJavaScriptµ¥Ôª²âÊÔ¹¤¾ß£¬Ò×ÓÚÓë³ÖÐø¹¹½¨ÏµÍ³Ï༯³É²¢Äܹ»ÔÚ¶à¸öä¯ÀÀÆ÷ÉÏÔËÐвâÊÔÇáËÉʵÏÖTDD·ç¸ñµÄ¿ª·¢¡£µ±ÔÚÏîÄ¿ÖÐÅäÖúÃJsTestDriverÒÔºó£¬Èçͬjunit²âÊÔjavaÎļþÒ»°ã£¬JsTestDriver¿ÉÒÔÖ±½Óͨ¹ýÔËÐÐjsÎļþÀ´½øÐе¥Ôª²âÊÔ¡£JsTestDriver¿ò¼Ü±¾Éí¾ÍÊÇJAVAµÄjar°ü£¬ÐèÒªÔÚ±¾µØÔËÐв¢¼àÌýÒ»¸ö¶Ë¿Ú¡£
b) Óŵã
¿ÉÒÔÒ»´Î²âÊÔ¶à¸öä¯ÀÀÆ÷£¬Ê¹Ó÷½·¨ÊÇÔÚÆô¶¯·þÎñʱ¿ÉÒÔ½«¶à¸öä¯ÀÀÆ÷µÄ·¾¶×÷Ϊ²ÎÊý´«½øÈ¥¡£¿ÉÒÔÔÚ¶ą̀»úÆ÷ÉϵÄä¯ÀÀÆ÷ÖÐÔËÐУ¬°üÀ¨Òƶ¯É豸¡£
²âÊÔÔËÐеúܿ죬ÒòΪ²»ÐèÒª½«½á¹ûÌí¼Óµ½DOMÖгÊÏÖ³öÀ´£¬ËüÃÇÄܹ»Í¬Ê±ÔÚÈÎÒâ¶àµÄä¯ÀÀÆ÷ÖÐÔËÐУ¬Î´Ð޸ĵÄÎļþä¯ÀÀÆ÷»á´Ó»º´æÌáÈ¡¡£
²»ÐèÒªHTMLÅä¼þÎļþ£¬½ö½öÖ»ÐèÌṩһ¸ö»ò¶à¸ö½Å±¾ºÍ²âÊԽű¾£¬²âÊÔÔËÐÐÆ÷ÔËÐÐʱ»á´´½¨Ò»¸ö¿ÕÎļþ¡£
Äܷܺ½±ãµÄºÍAnt¡¢MavenµÈ½øÐм¯³É½øÐÐ×Ô¶¯»¯²âÊÔ£¬Ò²¿ÉÒÔ·½±ãºÍJekinsµÈ³ÖÐø¼¯³É¹¤¾ß½øÐм¯³É£¬¿ÉÒÔÉú³É²âÊÔ½á¹ûµÄXMLÎĵµ¡£
ÓÐEclipseºÍIntelliJ²å¼þ£¬¿ÉÒԺܷ½±ãµÄÔÚÕâÁ½¸öIDEÖнøÐвâÊÔ£¬ºÍJUnitºÜÏñ¡£
Ö§³ÖÆäËü²âÊÔ¿ò¼Ü£¬¿ÉÒÔ²âÊÔÆäËü²âÊÔ¿ò¼ÜдµÄ²âÊÔ´úÂ룬±ÈÈçÓжÔÓ¦µÄ²å¼þ¿ÉÒÔ½«QUnitºÍJasmine²âÊÔ´úÂëת»»³ÉJsTestDriverµÄ²âÊÔ´úÂë¡£
c) ²»×ã
²»ÄÜÔÚä¯ÀÀÆ÷ÖвâÊÔ£¬Ö»ÄÜͨ¹ý×Ô¶¯»¯¹¤¾ß»ò¿ØÖÆÌ¨ÔËÐС£Éú³ÉµÄ½á¹û²»¹»Ö±¹Û¡£
°²×°Ê¹ÓÃÉÔ΢ÓеãÂé·³£¬ÒÀÀµÓÚJAVA»·¾³¡£
d) API
assert(msg, value)
assertTrue(msg, value)
assertFalse(msg, value)
assertEquals(msg, expected, actual)
assertNotEquals(msg, expected, actual)
assertSame(msg, expected, actual)
assertNotSame(msg, expected, actual)
assertNull(msg, value)
assertNotNull(msg, value)
assertUndefined(msg, value)
assertNotUndefined(msg, value)
assertNaN(msg, number)
assertNotNaN(msg, number)
assertException(msg, callback, type)
assertNoException(msg, callback)
assertArray(msg, arrayLike)
assertTypeOf(msg, type, object)
assertBoolean(msg, value)
assertFunction(msg, value)
assertNumber(msg, value)
assertObject(msg, value)
assertString(msg, value)
assertMatch(msg, pattern, string)
assertNoMatch(msg, pattern, string)
assertTagName(msg, tagName, element)
assertClassName(msg, className, element)
assertElementId(msg, id, element)
assertInstanceOf(msg, constructor, object)
assertNotInstanceOf(msg, constructor, object)
|
API°´×ÖÃæÒâ˼Àí½â¼´¿É£¬²»Ò»Ò»±ê×¢
e) ʹÓÃ
ǰÌ᣺
°²×°java»·¾³
ÏÂÔØJsTestDriver.jar
Ŀ¼£º
JsTestDriver.jar
jsTestDriver.conf //ÅäÖÃÎļþ£¬Ä¬ÈÏÃû³Æ£¬Èç¹ûÓÃÆäËüÃû³Æ£¬ÐèÒªÖ¸¶¨config²ÎÊý
src
----src.js
test
----test.js
jsTestDriver.conf£º

src.js£º

test.js£º

ÏñjavaµÄJUnitÒ»Ñù£¬²âÊÔ·½·¨ÃûÒªÒÔ¡±test¡±¿ªÍ·£¬È磺¡±testXXXX¡±
²âÊÔ²½Ö裺
1.cmd ½øÈëĿ¼
2.ÔËÐÐÃüÁjava ¨Cjar JsTestDriver.jar ¨Cport
9876¡±
3.´ò¿ªÒ³Ãæhttp://localhost:9876£¬µã»÷¡°²¶»ñä¯ÀÀÆ÷¡±¡£
4.дò¿ªÒ»¸öÖÕ¶Ë£¬ÔËÐÐÃüÁjava ¨Cjar JsTestDriver.jar
¨Ctests all¡±£¬ÔËÐÐËùÓвâÊÔÓÃÀý
5.Ò²¿ÉÒÔµ¥¶ÀÔËÐÐijһ¸öÓÃÀý£¬ÈçÔËÐÐÃüÁ java ¨Cjar JsTestDriver.jar
¨Ctests addTest.testA¡±
FireUnit
a) ¼ò½é
FireUnitÊÇÒ»¸ö»ùÓÚFirebugµÄJavascriptµÄµ¥Ôª²âÊÔ¿ò¼Ü¡£¼òµ¥ËµÀ´£¬FireUnit¸øFirebugÔö¼ÓÁËÒ»¸ö±êÇ©Ãæ°å£¬²¢ÌṩÁËһЩ¼òµ¥µÄJavaScript
APIÀ´¼Ç¼ºÍ²é¿´²âÊÔ¡£
b) Óŵã
¼òµ¥Ò×ÓÃ
c) ²»×ã
¹¦Äܲ»¶à£¬²âÊÔ´úÂë³£³£Ð´ÔÚÔ´ÂëÀËäÈ»¿ÉÒÔʵʱµØ¿´µ½Ð§¹û£¬µ«ñîºÏ̫ǿ£¬²»Ò×ÇåÀí
Ö»ÔËÐÐÔÚFirefoxÏÂ
d) API
³£Óãº
fireunit.ok(condition, message) true/false
fireunit.compare(actual, expect, message) ÊÇ·ñÏàµÈ
fireunit.reCompare(regexp, string, message) ×Ö·û´®ÊÇ·ñÓëÕýÔòʽƥÅä
fireunit.testDone(); Ö´ÐÐÒÔÉϵIJâÊÔ£¬ÔÚFirebugµÄбêÇ©testÖÐÏÔʾ½á¹û
ÆäËü£º
fireunit.runTests(¡°test2.html¡±, ¡°test3.html¡±) Ò»ÆðÔËÐжà¸öÒ³ÃæµÄ²âÊÔ(ÿ¸öÎļþ¶¼º¬ÓÐһЩ¶ÀÁ¢µÄ²âÊÔ)
fireunit.log(message) ´òÓ¡log£¬µ«Ëƺõ²»¹ÜÓÃ
fireunit.id(id) Ï൱Óëdocument.getElementById
fireunit.click(element) Ä£Äâ´¥·¢elementµÄclickʼþ
fireunit.focus(element) Ä£Äâ´¥·¢elementµÄfocusʼþ
fireunit.mouseDown(element) Ä£Äâ´¥·¢elementµÄmouseDownʼþ
µ«¿´´úÂëÃ÷Ã÷ÊÇclickʼþ

ÔÚFFÏ£¬Ö»ÊÇÖ´ÐÐÁËnode.click();²»»á´¥·¢onmousedown£¬Ö»»á´¥·¢onclick¡£ÒÑÑéÖ¤
fireunit.value(element) ÐÞ¸ÄelementµÄvalue
fireunit.key(element, key) Ä£Äâ´¥·¢elementµÄkeyʼþ
Àý£º
var input = document.getElementsByTagName(¡°input¡±)[0];
fireunit.key(input, ¡°a¡±);
|
ûÓùý£º
fireunit.browser
fireunit.test
fireunit.forceHTTP
fireunit.registerPathHandler
fireunit.panel
fireunit.privilege
|
e) ʹÓÃ
ÔÚFFÏÂ×°FirebugºÍFireUnit
Ö±½ÓÔÚ´úÂëÀïд²âÊÔ£¬¾ÍÏñconsole.log();
4. С½á
QUnit¿ò¼Ü¼òµ¥·½±ã£¬²âÊÔ½çÃæÖ±¹ÛÏêϸ£¬Jasmine¹¦ÄÜÇ¿´ó£¬·ç¸ñÒ²¼òµ¥Ã÷ÁË£¬·ûºÏǰ¶Ë¿ª·¢Õߵıà³Ìϰ¹ß£¬ÍƼöJsTestDriver¿ÉÒÔºÍQUnitµÈ¿ò¼Ü½áºÏ£¬¿ÉÒÔͬʱ²â¶à¸öä¯ÀÀÆ÷¡£µ«°²×°¸´ÔÓ£¬Ö»ÄÜÔÚ¿ØÖÆÌ¨ÏÔʾ£¬²»ÓѺ㬲»¹»ÇåÎú¡£FireUnitСÇÉÁé»î£¬¼ÓÉÏFirebugµÄÈËÆøÓ¦¸ÃºÜÊÜ»¶Ó¡£Èç¹ûÐèÒª½øÐÐ×Ô¶¯»¯²âÊÔ£¬
¶àÁ˽âÒ»ÏÂJasmineºÍJsTestDriver£¬±¾ÎÄδÉîÈë¡£
|