introduction.js |
|
---|---|
Jasmine is a behavior-driven development framework for testing JavaScript code. It does not depend on any other JavaScript frameworks. It does not require a DOM. And it has a clean, obvious syntax so that you can easily write tests. JasmineはJavascriptコードをテストするための振舞い駆動開発フレームワークです。 他のJavascriptフレームワークに依存しませんし、DOMも必要としません。 簡単にテストを書くことができるように、きれいで分かりやすい構文を持っています。 This guide is running against Jasmine version FILLED IN AT RUNTIME. このガイドはバージョン FILLED IN AT RUNTIME に対して書かれたものです。 |
|
Suites:
|
// テスト例
describe("A suite", function() {
// 期待式と一緒にテスト仕様を定義します
it("contains spec with an expectation", function() {
expect(true).toBe(true);
});
});
|
It’s Just FunctionsItは単なる関数です。Since
|
// suiteは単なる関数です
describe("A suite is just a function", function() {
var a;
// そしてこれがテスト仕様です
it("and so is a spec", function() {
a = true;
expect(a).toBe(true);
});
});
|
Expectations期待式Expectations are built with the function 期待式は、実行値を引数に取る |
// 'toBe' matcherは===と同等です。
describe("The 'toBe' matcher compares with ===", function() {
|
MatchersEach matcher implements a boolean comparison between the actual value and the expected value. It is responsible for reporting to Jasmine if the expectation is true or false. Jasmine will then pass or fail the spec. それぞれの matcher は、実行値と期待値をboolean式で返す機能を実装しています。 それは期待式がtrueであるかfalseであるかJasmineに報告する責務を持ち、それによりJasmineは次にspecを渡すか、または失敗するか選択します。 |
// 肯定的な評価もできます
it("and has a positive case ", function() {
expect(true).toBe(true);
});
|
Any matcher can evaluate to a negative assertion by chaining the call to すべてmatcherは、期待式と |
// 否定的な評価もできます
it("and can have a negative case", function() {
expect(false).not.toBe(true);
});
});
|
Included Matchers含まれている Matcher 関数Jasmine has a rich set of matchers included. Each is used here – all expectations and specs pass. Jasmineには豊富なmatcherのセットを含んでいます。 すべての期待式はこのページにて使われており、specはすべて合格するようになっています。 There is also the ability to write custom matchers for when a project’s domain calls for specific assertions that are not included below. さらにプロジェクトの要求などで、以下に含まれていない特別なアサーションを利用したい場合は、カスタムmatchersを書くこともできます。 |
// 付属のMatcher
describe("Included matchers:", function() {
// 'toBe' matcherは===と同等です。
it("The 'toBe' matcher compares with ===", function() {
var a = 12;
var b = a;
expect(a).toBe(b);
expect(a).not.toBe(null);
});
// 'toEqual' matcher
describe("The 'toEqual' matcher", function() {
// シンプルなリテラル、変数に使う
it("works for simple literals and variables", function() {
var a = 12;
expect(a).toEqual(12);
});
// オブジェクトに使う
it("should work for objects", function() {
var foo = {
a: 12,
b: 34
};
var bar = {
a: 12,
b: 34
};
expect(foo).toEqual(bar);
});
});
// 'toMatch' matcherは正規表現を扱います
it("The 'toMatch' matcher is for regular expressions", function() {
var message = 'foo bar baz';
expect(message).toMatch(/bar/);
expect(message).toMatch('bar');
expect(message).not.toMatch(/quux/);
});
// 'toBeDefined' matcherは`undefined`との比較を行います
it("The 'toBeDefined' matcher compares against `undefined`", function() {
var a = {
foo: 'foo'
};
expect(a.foo).toBeDefined();
expect(a.bar).not.toBeDefined();
});
// 'toBeUndefined' matcherも`undefined`との比較を行います
it("The `toBeUndefined` matcher compares against `undefined`", function() {
var a = {
foo: 'foo'
};
expect(a.foo).not.toBeUndefined();
expect(a.bar).toBeUndefined();
});
// 'toBeNull' matcherはnullとの比較を行います
it("The 'toBeNull' matcher compares against null", function() {
var a = null;
var foo = 'foo';
expect(null).toBeNull();
expect(a).toBeNull();
expect(foo).not.toBeNull();
});
// 'toBeTruthy' matcherはbooleanにキャストした結果との比較を行います
it("The 'toBeTruthy' matcher is for boolean casting testing", function() {
var a, foo = 'foo';
expect(foo).toBeTruthy();
expect(a).not.toBeTruthy();
});
// 'toBeFalsy' matcherもbooleanにキャストした結果との比較を行います
it("The 'toBeFalsy' matcher is for boolean casting testing", function() {
var a, foo = 'foo';
expect(a).toBeFalsy();
expect(foo).not.toBeFalsy();
});
// 'toContain' matcherは配列の中からアイテムを見つけるために使います
it("The 'toContain' matcher is for finding an item in an Array", function() {
var a = ['foo', 'bar', 'baz'];
expect(a).toContain('bar');
expect(a).not.toContain('quux');
});
// 'toBeLessThan' matcherは数学的な比較を行います
it("The 'toBeLessThan' matcher is for mathematical comparisons", function() {
var pi = 3.1415926, e = 2.78;
expect(e).toBeLessThan(pi);
expect(pi).not.toBeLessThan(e);
});
// 'toBeGreaterThan' matcherも数学的な比較を行います
it("The 'toBeGreaterThan' is for mathematical comparisons", function() {
var pi = 3.1415926, e = 2.78;
expect(pi).toBeGreaterThan(e);
expect(e).not.toBeGreaterThan(pi);
});
// 'toBeCloseTo' matcherは与えられたレベルにおける十進精度の比較を行います
it("The 'toBeCloseTo' matcher is for precision math comparison", function() {
var pi = 3.1415926, e = 2.78;
expect(pi).not.toBeCloseTo(e, 2);
expect(pi).toBeCloseTo(e, 0);
});
// 'toThrow' matcherはfunctionが例外を発生させる場合のテストに用います
it("The 'toThrow' matcher is for testing if a function throws an exception", function() {
var foo = function() {
return 1 + 2;
};
var bar = function() {
return a + 1;
};
expect(foo).not.toThrow();
expect(bar).toThrow();
});
});
|
Grouping Related Specs with
|
describe("A spec", function() {
// これは単なる関数なので、いかなるコードも定義することが出来ます
it("is just a function, so it can contain any code", function() {
var foo = 0;
foo += 1;
expect(foo).toEqual(1);
});
// 1つ以上の期待式を含めることができます
it("can have more than one expectation", function() {
var foo = 0;
foo += 1;
expect(foo).toEqual(1);
expect(true).toEqual(true);
});
});
|
Setup and TeardownSetup と TeardownTo help a test suite DRY up any duplicated setup and teardown code, Jasmine provides the global setupとteardownのコードがテストSuiteでDRY原則に従えるよう、 Jasmineではグローバル関数 Here is the same set of specs written a little differently. The variable under test is defined at the top-level scope — the ここに、少し異なるように書かれたspecの同じセットがあります。
最上位のスコープにある |
// spec(setupとtear-downを伴った)
describe("A spec (with setup and tear-down)", function() {
var foo;
beforeEach(function() {
foo = 0;
foo += 1;
});
afterEach(function() {
foo = 0;
});
// これは単なる関数なので、いかなるコードも定義することが出来ます
it("is just a function, so it can contain any code", function() {
expect(foo).toEqual(1);
});
// 1つ以上の期待式を含めることができます
it("can have more than one expectation", function() {
expect(foo).toEqual(1);
expect(true).toEqual(true);
});
});
|
Nesting
|
describe("A spec", function() {
var foo;
beforeEach(function() {
foo = 0;
foo += 1;
});
afterEach(function() {
foo = 0;
});
// これは単なる関数なので、いかなるコードも定義することが出来ます
it("is just a function, so it can contain any code", function() {
expect(foo).toEqual(1);
});
// 1つ以上の期待式を含めることができます
it("can have more than one expectation", function() {
expect(foo).toEqual(1);
expect(true).toEqual(true);
});
// 内側にネストした2番目のdescribe
describe("nested inside a second describe", function() {
var bar;
beforeEach(function() {
bar = 1;
});
// 必要に応じて両方のスコープを参照できます
it("can reference both scopes as needed ", function() {
expect(foo).toEqual(bar);
});
});
});
|
Disabling Specs and SuitesSpecs と Suites を無効にするSuites and specs can be disabled with the suiteやspecは、それぞれ |
xdescribe("A spec", function() {
var foo;
beforeEach(function() {
foo = 0;
foo += 1;
});
// これは単なる関数なので、いかなるコードも定義することが出来ます
xit("is just a function, so it can contain any code", function() {
expect(foo).toEqual(1);
});
});
|
SpiesJasmine’s test doubles are called spies. A spy can stub any function and tracks calls to it and all arguments. There are special matchers for interacting with spies. Jasmineにおけるテストダブルはspyと呼ばれています。 spyは任意の関数のスタブとなることができ、その呼び出しやすべての引数を追跡することができます。 そしてspyと相互に作用する特別なmatcherがあります The spyが呼び出された場合、 |
describe("A spy", function() {
var foo, bar = null;
beforeEach(function() {
foo = {
setBar: function(value) {
bar = value;
}
};
spyOn(foo, 'setBar');
foo.setBar(123);
foo.setBar(456, 'another param');
});
// spyが呼び出されたことを追跡します
it("tracks that the spy was called", function() {
expect(foo.setBar).toHaveBeenCalled();
});
// 呼び出し回数を追跡します
it("tracks its number of calls", function() {
expect(foo.setBar.calls.length).toEqual(2);
});
// 呼び出す際のすべての引数を追跡します
it("tracks all the arguments of its calls", function() {
expect(foo.setBar).toHaveBeenCalledWith(123);
expect(foo.setBar).toHaveBeenCalledWith(456, 'another param');
});
// 最も直近に呼び出されたものにアクセスすることもできます
it("allows access to the most recent call", function() {
expect(foo.setBar.mostRecentCall.args[0]).toEqual(456);
});
// (直近だけでなく)任意の呼び出しもアクセスすることができます
it("allows access to other calls", function() {
expect(foo.setBar.calls[0].args[0]).toEqual(123);
});
// 関数上ですべての実行を停止します
it("stops all execution on a function", function() {
expect(bar).toBeNull();
});
});
|
Spies:
|
// call throughで構成されるspy
describe("A spy, when configured to call through", function() {
var foo, bar, fetchedBar;
beforeEach(function() {
foo = {
setBar: function(value) {
bar = value;
},
getBar: function() {
return bar;
}
};
spyOn(foo, 'getBar').andCallThrough();
foo.setBar(123);
fetchedBar = foo.getBar();
});
// spyが呼び出されたことを追跡します
it("tracks that the spy was called", function() {
expect(foo.getBar).toHaveBeenCalled();
});
// 他のfunctionの影響を受けてはならない
it("should not affect other functions", function() {
expect(bar).toEqual(123);
});
// 呼び出された場合、要求された値が返されます
it("when called returns the requested value", function() {
expect(fetchedBar).toEqual(123);
});
});
|
Spies:
|
// 戻り値を偽装したspy
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);
foo.setBar(123);
fetchedBar = foo.getBar();
});
// spyが呼び出されたことを追跡します
it("tracks that the spy was called", function() {
expect(foo.getBar).toHaveBeenCalled();
});
// 他の機能の影響を受けてはならない
it("should not affect other functions", function() {
expect(bar).toEqual(123);
});
// 呼び出された場合、要求された値が返されます
it("when called returns the requested value", function() {
expect(fetchedBar).toEqual(745);
});
});
|
Spies:
|
// 戻り値を偽装したspy
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').andCallFake(function() {
return 1001;
});
foo.setBar(123);
fetchedBar = foo.getBar();
});
// spyが呼び出されたことを追跡します
it("tracks that the spy was called", function() {
expect(foo.getBar).toHaveBeenCalled();
});
// 他の機能の影響を受けてはならない
it("should not affect other functions", function() {
expect(bar).toEqual(123);
});
// 呼び出された場合、要求された値が返されます
it("when called returns the requested value", function() {
expect(fetchedBar).toEqual(1001);
});
});
|
Spies:
|
// 独自で作成したspy
describe("A spy, when created manually", function() {
var whatAmI;
beforeEach(function() {
whatAmI = jasmine.createSpy('whatAmI');
whatAmI("I", "am", "a", "spy");
});
// これはエラーレポートのための名称です
it("is named, which helps in error reporting", function() {
expect(whatAmI.identity).toEqual('whatAmI');
});
// spyが呼び出されたことを追跡します
it("tracks that the spy was called", function() {
expect(whatAmI).toHaveBeenCalled();
});
// 呼び出し回数を追跡します
it("tracks its number of calls", function() {
expect(whatAmI.calls.length).toEqual(1);
});
// 呼び出す際のすべての引数を追跡します
it("tracks all the arguments of its calls", function() {
expect(whatAmI).toHaveBeenCalledWith("I", "am", "a", "spy");
});
// 最も直近に呼び出されたものにアクセスすることもできます
it("allows access to the most recent call", function() {
expect(whatAmI.mostRecentCall.args[0]).toEqual("I");
});
});
|
Spies:
|
// 複数のspyを独自で作成した場合
describe("Multiple spies, when created manually", function() {
var tape;
beforeEach(function() {
tape = jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']);
tape.play();
tape.pause();
tape.rewind(0);
});
// 要求された機能ごとにspyを作成します
it("creates spies for each requested function", function() {
expect(tape.play).toBeDefined();
expect(tape.pause).toBeDefined();
expect(tape.stop).toBeDefined();
expect(tape.rewind).toBeDefined();
});
// spyが呼び出されたことを追跡します
it("tracks that the spies were called", function() {
expect(tape.play).toHaveBeenCalled();
expect(tape.pause).toHaveBeenCalled();
expect(tape.rewind).toHaveBeenCalled();
expect(tape.stop).not.toHaveBeenCalled();
});
// 呼び出す際のすべての引数を追跡します
it("tracks all the arguments of its calls", function() {
expect(tape.rewind).toHaveBeenCalledWith(0);
});
});
|
Matching Anything with
|
describe("jasmine.any", function() {
// 任意の値とマッチング
it("matches any value", function() {
expect({}).toEqual(jasmine.any(Object));
expect(12).toEqual(jasmine.any(Number));
});
// spyと一緒に使用する場合
describe("when used with a spy", function() {
it("is useful for comparing arguments", function() {
var foo = jasmine.createSpy('foo');
foo(12, function() {
return true;
});
expect(foo).toHaveBeenCalledWith(jasmine.any(Number), jasmine.any(Function));
});
});
});
|
Mocking the JavaScript ClockJavaScript タイマーMockを作成するThe Jasmine Mock Clock is available for test suites that need the ability to use JasmineのMock Clockは、テストsuiteが |
// Jasmine Mock Clockで手動タイマー
describe("Manually ticking the Jasmine Mock Clock", function() {
var timerCallback;
|
It is installed with a call to タイマー関数を呼び出すspecやsuiteの中で、 |
beforeEach(function() {
timerCallback = jasmine.createSpy('timerCallback');
jasmine.Clock.useMock();
});
|
Calls to any registered callback are triggered when the clock is ticked forward via the
|
// timeoutが同期して呼び出されている
it("causes a timeout to be called synchronously", function() {
setTimeout(function() {
timerCallback();
}, 100);
expect(timerCallback).not.toHaveBeenCalled();
jasmine.Clock.tick(101);
expect(timerCallback).toHaveBeenCalled();
});
// intervalが同期して呼び出されている
it("causes an interval to be called synchronously", 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);
});
});
|
Asynchronous Support非同期のサポートJasmine also has support for running specs that require testing asynchronous operations. またJasmineでは、非同期処理をテストする必要があるspecの実行もサポートしています。 |
// 非同期spec
describe("Asynchronous specs", function() {
var value, flag;
// 非同期テストの準備と結果予測をサポートしています
it("should support async execution of test preparation and expectations", function() {
|
Specs are written by defining a set of blocks with calls to specは |
runs(function() {
flag = false;
value = 0;
setTimeout(function() {
flag = true;
}, 500);
});
|
The
The latch function polls until it returns true or the timeout expires, whichever comes first. If the timeout expires, the spec fails with the error message. latch回路関数は、tureかタイムアウトのいずれかが返されるまでポーリングします。 タイムアウトが発生した場合、specは障害メッセージとともに失敗します。 |
waitsFor(function() {
value++;
return flag;
}, "The Value should be incremented", 750);
|
Once the asynchronous conditions have been met, another 一度、非同期の条件が満たされれば、他の |
runs(function() {
expect(value).toBeGreaterThan(0);
});
});
});
|
The Runner and ReporterRunnerおよびReporterJasmine is built in JavaScript and must be included into a JS environment, such as a web page, in order to run. Like this web page. JasmineはJavascriptで構築され、実行するためにWebページなどのJS実行環境に含まれる必要があります。 例えばこのWebページのように。 This file is written in JavaScript and is compiled into HTML via Rocco. The JavaScript file is then included, via a このファイルはJavascriptで記述され、RoccoでHTMLにコンパイルされます。
Javascriptファイルはこのとき、 Scroll down the page to see the results of the above specs. All of the specs should pass. ページをスクロールダウンして上記のspecの結果を表示してください。 もちろん、すべてのspecが合格しているはずです。 Meanwhile, here is how a runner works to execute a Jasmine suite. これらが、runnerがJasmineのsuiteを実行する仕組みです。 |
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 250;
|
Create the
|
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
|
Delegate filtering of specs to the reporter. Allows for clicking on single suites or specs in the results to only run a subset of the suite. Reporterにフィルタリングするspecを渡してください。 単一のsuiteやspecをクリックすることで、suiteの一部分のみを実行して結果を取得することができます。 |
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
|
Run all of the tests when the page finishes loading – and make sure to run any previous ページのロードが完了した際に、すべてのテストを実行します。 そして、 Test Resultsテスト結果Scroll down to see the results of all of these specs. これらすべてのspec結果を見るためにスクロールダウンしてください。 |
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
document.querySelector('.version').innerHTML = jasmineEnv.versionString();
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
|
Downloads
Support
ThanksRunning documentation inspired by @mjackson and the 2012 Fluent Summit. このランニングドキュメントは@mjacksonと2012年のFluent Summitからインスパイアされたものです。 翻訳
|
|