亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目次
キーポイント
シノンはどのように働いていますか?
スパイの主な目的は、関數(shù)呼び出しに関する情報(bào)を収集することです。それらを使用して、関數(shù)が呼び出されたかどうかなど、特定のことを確認(rèn)することもできます。
sinonの主張
sinonは魔法ではありません
スタブはどうですか?
sinon.jsの模擬、スパイ、スタブの違いは何ですか?
javascriptでの単體テストにsinon.jsを使用する方法は?
sinon.jsでスパイを作成する方法は?
sinon.jsでスタブを作成する方法は?
スタブをスローする方法はエラーですか?
ホームページ ウェブフロントエンド jsチュートリアル Sinonチュートリアル:模擬、スパイ、スタブを使用したJavaScriptテスト

Sinonチュートリアル:模擬、スパイ、スタブを使用したJavaScriptテスト

Feb 18, 2025 am 10:13 AM

Sinon Tutorial: JavaScript Testing with Mocks, Spies & Stubs

この記事は、マーク?ブラウンとマーク?トウラーによってレビューされました。 SitePointコンテンツを最高の狀態(tài)にしてくれたすべてのSitePointピアレビューアに感謝します!

ユニットテストを書く際の最大の障害の1つは、自明でないコードを処理する方法です。

実際のプロジェクトでは、コードは多くの場(chǎng)合、テストを困難にするさまざまな操作を?qū)g行します。 ajaxリクエスト、タイマー、日付、他のブラウザ機(jī)能へのアクセス…またはデータベースは、node.jsを使用している場(chǎng)合は常に楽しいです。ネットワークまたはファイルアクセスもそうです。

コードでそれらを制御できないため、これらすべてをテストするのは困難です。 AJAXを使用している場(chǎng)合、テストが合格できるようにリクエストに応答するサーバーが必要です。 Settimeoutを使用する場(chǎng)合、テストは待つ必要があります。データベースまたはネットワークにも同じことが言えます。正しいデータを備えたデータベースまたはネットワークサーバーが必要です。

実生活は、多くのテストチュートリアルが見えるほど簡単ではありません。しかし、あなたは解決策があることを知っていますか?

Sinonを使用することで、些細(xì)なコードを簡単にテストすることができます!

それがどのように機(jī)能するか見てみましょう。

キーポイント

  • Sinon Simplified Testing:Sinon.jsは、Ajaxコール、タイマー、データベースの相互作用などの複雑な操作を含むJavaScriptコードのテストを簡素化するために重要です。これにより、これらの部品をモック、スパイ、スタブに置き換えることができます。
  • 3種類のテストスタンド:Sinonは、スパイを分類します(関數(shù)呼び出しに関する情報(bào)を収集する)。オブジェクト全體)。
  • 実際のケース:Sinonは、外部API呼び出しや時(shí)間ベースの機(jī)能など、外部依存関係が複雑または速度を落とすことができる?yún)g體テストシナリオに特に役立ちます。
  • 統(tǒng)合とセットアップ:Sinonは、node.jsおよびブラウザーベースのテスト環(huán)境に簡単に統(tǒng)合でき、さまざまなJavaScriptアプリケーションでの汎用性と使いやすさを向上させることができます。
  • 強(qiáng)化されたアサーション:Sinonは、より明確なエラーメッセージを生成する拡張されたアサーションメソッドを提供し、テスト障害中のデバッグプロセスを改善します。
  • ベストプラクティス:パッケージテストケースを使用すると、テストの代役が適切にクリーニングされ、他のテストの副作用が防止され、テストスイートの潛在的なエラーが減少します。 sinon.test()
シノンがとても重要で便利な理由は何ですか?

要するに、シノンを使用すると、テストの難しい部分を簡単にするものに置き換えることができます。

コードをテストする場(chǎng)合、テスト以外の要因の影響を受けたくありません。いくつかの外部要因がテストに影響する場(chǎng)合、テストはより複雑になり、ランダムに失敗する可能性があります。

ajax呼び出しを行うコードをテストしたい場(chǎng)合、どのように行いますか?サーバーを?qū)g行し、テストに必要な正確な応答を提供する必要があります。セットアップは複雑で、執(zhí)筆と実行のユニットテストを困難にします。

コードが時(shí)間に依存している場(chǎng)合はどうなりますか?アクションを?qū)g行する前に1秒間待っているとします。今何をすべきか?テストでSettimeoutを使用して1秒間待つことができますが、これによりテストが遅くなります。たとえば、5分間の間隔が長い場(chǎng)合を想像してください。おそらく、テストを?qū)g行するたびに5分待たたくないと思います。

Sinonを使用することで、これらの問題(および他の多くの問題)の両方を解決し、複雑さを排除できます。

シノンはどのように働いていますか?

sinonは、いわゆるテストを簡単に作成できるようにすることで、テストの複雑さを削除するのに役立ちます

名前が示すように、テストの代役は、テストで使用されているコードスニペットの代替品です。 Ajaxの例を振り返ってみると、サーバーをセットアップするのではなく、代わりにAjaxコールをTest Stand-Inに置き換えます。時(shí)間の例では、テストの代役を使用して、「前方に移動(dòng)する」ことができます。

これは少し奇妙に聞こえるかもしれませんが、基本的な概念は簡単です。 JavaScriptは非常に動(dòng)的であるため、あらゆる機(jī)能を採用して他のものに置き換えることができます。代役をテストすることは、このアイデアをさらに一歩進(jìn)めていることです。 Sinonを使用すると、JavaScript関數(shù)をテストの代役に置き換えることができます。その後、さまざまな操作を?qū)g行するように設(shè)定して、複雑なものを簡単にすることができます。

Sinonは、テストのスタンドインを3つのタイプに分割します:

    スパイ、機(jī)能に影響を與えることなく関數(shù)呼び出しに関する情報(bào)を提供
  • スパイのような
  • スタブですが、関數(shù)を完全に置き換えます。これにより、スタブ関數(shù)に好きなことをさせることができます - 例外をスローする、特定の値を返すなど
  • シミュレーションでは、スパイとスタブを組み合わせることで、オブジェクト全體を簡単に交換できます
  • さらに、Sinonは他のヘルププログラムを提供していますが、これらのヘルププログラムはこの記事の範(fàn)囲外です。

偽のタイマーは、setimeoutのトリガーなど、時(shí)間を前進(jìn)させるために使用できます

    偽のxmlhttprequestとサーバー。これは、ajaxのリクエストと応答を偽造するために使用できます
  • これらの機(jī)能により、Sinonは、テストの外部依存関係によって引き起こされるすべての困難を解決できます。 Sinonを効果的に使用するためのヒントを?qū)W習(xí)した場(chǎng)合、他のツールは必要ありません。
インストールsinon

最初に、Sinonをインストールする必要があります。

Node.jsテストの場(chǎng)合:

NPMを使用して、Sinonをインストールして、NPM

を介してSinonをインストールします

var sinon = require( 'sinon')を使用したテストでsinon
    を紹介します。
  1. ブラウザベースのテストの場(chǎng)合:
    1. NPMを使用してSinonをインストールしてNPM経由でSinonをインストールしたり、CDNを使用したり、SinonのWebサイトからダウンロードしたりできます。
    2. テストランナーページにsinon.jsを含めます。
    初心者

    sinonには多くの機(jī)能がありますが、それらの多くはそれ自體に構(gòu)築されています。あなたはそれの一部を知っています、そしてあなたはすでに次の部分を知っています。基本を理解し、それぞれの異なる部分が何をするかを理解したら、これによりSinonは使いやすくなります。

    コードがトラブルを引き起こす関數(shù)を呼び出すときに、通常、シノンが必要です。

    ajaxの場(chǎng)合、$ .getまたはxmlhttprequestです。しばらくの間、関數(shù)はsetimeoutである可能性があります。データベースの場(chǎng)合、mongodb.findoneかもしれません。

    この関數(shù)を簡単に議論することを簡単にするために、私はそれを

    依存関係

    と呼びます。テストしている関數(shù)は、別の関數(shù)の結(jié)果に依存します。 Sinonの基本的な使用パターンは、問題のある依存関係をテストのスタンドインに置き換えることです。

    ajaxをテストするとき、xmlhttprequestをajax要求をシミュレートするテストの代役に置き換えます

    時(shí)間をテストするとき、SettimeOutを偽のタイマーに置き換えます
  • データベースアクセスをテストするとき、mongodb.findoneをすぐにいくつかの偽データを返すテストの適切なものに置き換えることができます
  • それが実際にどのように機(jī)能するか見てみましょう。
  • spy

スパイはシノンの最も簡単な部分であり、他の機(jī)能が構(gòu)築されています。

スパイの主な目的は、関數(shù)呼び出しに関する情報(bào)を収集することです。それらを使用して、関數(shù)が呼び出されたかどうかなど、特定のことを確認(rèn)することもできます。

function sinon.spyは、関數(shù)のように呼ばれることができるスパイオブジェクトを返しますが、それに作られた呼び出しに関する屬性も含まれています。上記の例では、FirstCallプロパティには、渡されたパラメーターリストであるFirstCall.Argsなど、最初の呼び出しに関する情報(bào)が含まれています。

パラメーターなしでsinon.spyを呼び出すことで匿名のスパイを作成できますが、より一般的なパターンは、別の関數(shù)をスパイに置き換えることです。
var spy = sinon.spy();

//我們可以像函數(shù)一樣調(diào)用間諜
spy('Hello', 'World');

//現(xiàn)在我們可以獲取有關(guān)調(diào)用的信息
console.log(spy.firstCall.args); //輸出:['Hello', 'World']

別の関數(shù)をスパイに置き換えて、前の例と同様に動(dòng)作しますが、1つの重要な違いがあります。スパイの使用が終了したら、上記の例の最後の行に示すように、元の関數(shù)を復(fù)元することを忘れないでください。これがなければ、テストは異常に動(dòng)作する場(chǎng)合があります。

Spyには、使用方法に関するさまざまな情報(bào)を提供するさまざまなプロパティがあります。 SinonのSPYドキュメントには、利用可能なすべてのオプションの完全なリストが含まれています。
var user = {
  ...
  setName: function(name){
    this.name = name;
  }
}

//為 setName 函數(shù)創(chuàng)建一個(gè)間諜
var setNameSpy = sinon.spy(user, 'setName');

//現(xiàn)在,每當(dāng)我們調(diào)用該函數(shù)時(shí),間諜都會(huì)記錄有關(guān)它的信息
user.setName('Darth Vader');

//我們可以通過查看間諜對(duì)象來查看
console.log(setNameSpy.callCount); //輸出:1

//重要最后一步 - 刪除間諜
setNameSpy.restore();

実際には、スパイを頻繁に使用することはできません。スタブが必要になる可能性が高いですが、コールバックが呼び出されることを確認(rèn)するなど、スパイは便利です。

この例では、モカをテストフレームワークとして、チャイをアサーションライブラリとして使用します。これら2つについて詳しく知りたい場(chǎng)合は、以前の投稿:JavaScriptのMochaとChaiを使用したユニットテストを參照してください。

sinonの主張

スタブに進(jìn)む前に、すぐに迂回して、シノンの主張を見てみましょう。

スパイ(およびスタブ)を使用するほとんどのテストケースでは、テストの結(jié)果を確認(rèn)するための何らかの方法が必要です。

あらゆる種類のアサーションを使用して、結(jié)果を確認(rèn)できます。コールバックに関する前の例では、チャイのアサート機(jī)能を使用しました。これにより、値が真の値であることが保証されます。

var spy = sinon.spy();

//我們可以像函數(shù)一樣調(diào)用間諜
spy('Hello', 'World');

//現(xiàn)在我們可以獲取有關(guān)調(diào)用的信息
console.log(spy.firstCall.args); //輸出:['Hello', 'World']

これを行うことの欠點(diǎn)は、障害時(shí)のエラーメッセージが不明であることです。 「falseは真実ではない」などのプロンプトのみを受け取ります。ご想像のとおり、これは問題がどこにあるかを見つけるのにあまり役に立たず、テストのソースコードを調(diào)べてそれを理解する必要があります。面白くない。

この問題を解決するために、カスタムエラーメッセージをアサーションに含めることができます。

var user = {
  ...
  setName: function(name){
    this.name = name;
  }
}

//為 setName 函數(shù)創(chuàng)建一個(gè)間諜
var setNameSpy = sinon.spy(user, 'setName');

//現(xiàn)在,每當(dāng)我們調(diào)用該函數(shù)時(shí),間諜都會(huì)記錄有關(guān)它的信息
user.setName('Darth Vader');

//我們可以通過查看間諜對(duì)象來查看
console.log(setNameSpy.callCount); //輸出:1

//重要最后一步 - 刪除間諜
setNameSpy.restore();
しかし、

獨(dú)自の主張を使用できるのはなぜですか? このようなSinonの主張を使用すると、すぐにより良いエラーメッセージを提供できます。これは、関數(shù)のパラメーターなどのより複雑な條件を検証する必要がある場(chǎng)合に役立ちます。

function myFunction(condition, callback){
  if(condition){
    callback();
  }
}

describe('myFunction', function() {
  it('should call the callback function', function() {
    var callback = sinon.spy();

    myFunction(true, callback);

    assert(callback.calledOnce);
  });
});
以下は、シノンによって提供された他のいくつかの有用な主張です:

sinon.assert.callededを使用して、関數(shù)が特定のパラメーターで呼び出されたことを確認(rèn)できます(これはおそらく私が最も使用するものです)

    sinon.assert.callorderは、関數(shù)が特定の順序で呼び出されていることを確認(rèn)できます
  • スパイと同様に、Sinonのアサーション文書には利用可能なすべてのオプションが含まれています。 Chaiを使用したい場(chǎng)合は、Sinon-Chaiプラグインも利用できます。これにより、Chaiの期待またはインターフェイスを介してSinonアサーションを使用できます。
スタブ

スタブは、柔軟で便利なため、好ましいテストの代役です。彼らはスパイのすべての機(jī)能を持っていますが、それらは監(jiān)視機(jī)能の役割以上のものであり、スタブはそれを完全に置き換えます。言い換えれば、Spyを使用する場(chǎng)合、元の関數(shù)はまだ実行されますが、スタブを使用する場(chǎng)合、実行されません。

これにより、以下などの多くのタスクにスタブが非常に適しています。

テストを遅くして書くのが困難になるajaxまたはその他の外部呼び出しを交換します

関數(shù)出力に従って異なるコードパスをトリガーします
    例外がスローされたときに何が起こるかなど、
  • テストの例外はありますか?
  • スタブを作成できる方法は、スパイのスタブと似ています...
スパイのような匿名のスタブを作成できますが、既存の関數(shù)をスタブに置き換えると、スタブは非常に便利になります。

たとえば、

jQueryのajax関數(shù)を使用するコードがある場(chǎng)合、テストすることは困難です。コードは、構(gòu)成するサーバーにリクエストを送信するため、使用可能にする必要があります。または、テスト環(huán)境でそれを行わないようにコードに特別なケースを追加する必要があります。これは大きなタブーです。コードにテスト固有のケースをほとんど含める必要はありません。
assert(callback.calledOnce);

悪いプラクティスに目を向ける代わりに、Sinonを使用してAjax機(jī)能をスタブに置き換えることができます。これにより、テストが些細(xì)なことになります。

これは、テストするサンプル関數(shù)です。オブジェクトをパラメーターとして使用し、AJAXを介して事前定義されたURLに送信します。

var spy = sinon.spy();

//我們可以像函數(shù)一樣調(diào)用間諜
spy('Hello', 'World');

//現(xiàn)在我們可以獲取有關(guān)調(diào)用的信息
console.log(spy.firstCall.args); //輸出:['Hello', 'World']

通常、これをテストすることは、AJAXコールと事前定義されたURLのために困難ですが、スタブを使用すると簡単になります。

リクエストが完了した後、SaveUserに渡されたコールバック関數(shù)が正しく呼び出されることを確認(rèn)する必要があるとします。

var user = {
  ...
  setName: function(name){
    this.name = name;
  }
}

//為 setName 函數(shù)創(chuàng)建一個(gè)間諜
var setNameSpy = sinon.spy(user, 'setName');

//現(xiàn)在,每當(dāng)我們調(diào)用該函數(shù)時(shí),間諜都會(huì)記錄有關(guān)它的信息
user.setName('Darth Vader');

//我們可以通過查看間諜對(duì)象來查看
console.log(setNameSpy.callCount); //輸出:1

//重要最后一步 - 刪除間諜
setNameSpy.restore();

ここでは、Ajax関數(shù)をスタブに置き換えます。これは、リクエストが送信されず、サーバーなどは必要ないことを意味します。テストコードで何が起こっているかを完全に制御できます。

SaveUserに渡すコールバックが呼び出されることを確認(rèn)したいので、Stub ried に指示します。これは、スタブがパラメーターとして渡された最初の関數(shù)を自動(dòng)的に呼び出すことを意味します。これにより、リクエストが完了した後にコールバックを呼び出す$ .POSTの動(dòng)作がシミュレートされます。

スタブに加えて、このテストでスパイも作成しました。通常の関數(shù)をコールバックとして使用できますが、スパイを使用すると、SinonのSinon.assert.calledonceアサーションを使用してテストの結(jié)果を簡単に検証できます。

ほとんどの場(chǎng)合、スタブが必要な場(chǎng)合は、同じ基本パターンに従うことができます。

    $ .post
  • などの問題の関數(shù)を見つけます
  • それがどのように動(dòng)作するかを見て、あなたがあなたのテストでそれをock笑することができる
  • スタブを作成します
  • スタブを設(shè)定して、テストで望ましい動(dòng)作を持つように
スタブは各動(dòng)作をシミュレートする必要はありません。テストに必要な唯一の動(dòng)作が必要であり、他のすべては省略できます。

スタブのもう1つの一般的な使用法は、特定のパラメーターセットで関數(shù)が呼び出されていることを確認(rèn)することです。

たとえば、AJAX関數(shù)の場(chǎng)合、正しい値が送信されることを確認(rèn)する必要があります。したがって、次のようなものを持つことができます

同様に、$ .post()のスタブを作成しましたが、今回はそれを設(shè)定しませんでした。このテストはコールバックを気にしないので、それを降伏させる必要はありません。

function myFunction(condition, callback){
  if(condition){
    callback();
  }
}

describe('myFunction', function() {
  it('should call the callback function', function() {
    var callback = sinon.spy();

    myFunction(true, callback);

    assert(callback.calledOnce);
  });
});
予想されるデータ、つまりURLとパラメーターを含むようにいくつかの変數(shù)を設(shè)定しました。このような変數(shù)を設(shè)定することは、一目でテストの要件を確認(rèn)できるため、良い習(xí)慣です。また、値を重複せずにユーザー変數(shù)を設(shè)定するのにも役立ちます。

今回は、sinon.assert.calledwith()アサーションを使用しました。スタブを正しいパラメーターで呼び出されていることを確認(rèn)する必要があるため、スタブを最初のパラメーターとして渡します。

SinonでAJAXリクエストをテストする別の方法があります。これは、Sinonの偽のxmlhttprequest機(jī)能を使用して行われます。ここでは詳細(xì)は説明しませんが、それがどのように機(jī)能するかを理解したい場(chǎng)合は、Sinonの偽のxmlhttprequestを使用したAjaxテストに関する私の記事をご覧ください。

シミュレーション

シミュレーションは、スタブとは異なるアプローチです。 「シミュレートされたオブジェクト」という用語を聞いたことがある場(chǎng)合は、それは同じことです。Sinonのシミュレーションを使用して、オブジェクト全體を置き換えて、スタブ関數(shù)と同様に動(dòng)作を変更できます。

単一のオブジェクトから複數(shù)の関數(shù)をスタブする必要がある場(chǎng)合、それらは主に有用です。単一の関數(shù)のみを交換する必要がある場(chǎng)合、スタブは使いやすくなります。

シミュレーションを使用するときは注意する必要があります!彼らの力のため、テストがあまりにも多く、あまりにも多くの具體的なものを具體的にするのは簡単であり、テストを誤って脆弱にする可能性があります。

スパイやスタブとは異なり、シミュレーションには組み込みのアサーションがあります。モックオブジェクトに何が起こる必要があるかを伝え、テストの最後に検証関數(shù)を呼び出すことにより、期待される結(jié)果を事前に定義できます。

store.jsを使用してコンテンツをLocalStorageに保存し、それに関連する関數(shù)をテストすると仮定します。シミュレーションを使用して、次のようにテストするのに役立ちます。

var spy = sinon.spy();

//我們可以像函數(shù)一樣調(diào)用間諜
spy('Hello', 'World');

//現(xiàn)在我們可以獲取有關(guān)調(diào)用的信息
console.log(spy.firstCall.args); //輸出:['Hello', 'World']
シミュレーションを使用する場(chǎng)合、上記のように、スムーズな呼び出しスタイルを使用して、予想される呼び出しとその結(jié)果を定義します。これは、テスト結(jié)果を検証するためにアサーションを使用することと同じですが、それらを事前に定義し、それらを確認(rèn)するために、テストの最後にstoremock.verify()を呼び出します。

を作成します。つまり、メソッドmock.something()は呼び出されると予想されます。各期待は、特定の関數(shù)をエミュレートすることに加えて、スパイやスタブと同じ機(jī)能をサポートします。

スタブの使用は通常、シミュレーションを使用するよりも簡単であることがわかります。まったく問題ありません。シミュレーションは注意して使用する必要があります。

シミュレートされた特定の関數(shù)の完全なリストについては、Sinonのシミュレーションドキュメントをご覧ください。

重要なベストプラクティス:sinon.test()

を使用します

sinonには、スパイ、スタブ、またはシミュレーションを使用する際に留意すべき重要なベストプラクティスがあります。

既存の関數(shù)をテストの代役に置き換える場(chǎng)合は、sinon.test()を使用します。

前の例では、stub.restore()またはmock.restore()を使用して、使用後に內(nèi)容をクリーンアップします。それ以外の場(chǎng)合は、テストの代役が施行され、他のテストに悪影響を與えるか、エラーにつながる可能性があるため、これが必要です。

しかし、restore()関數(shù)を直接使用することは問題です。テストされている関數(shù)は、restore()を呼び出す前にエラーを引き起こし、テスト関數(shù)を終了する場(chǎng)合があります!

この問題を解決する2つの方法があります。コンテンツ全體をTry Catchブロックでラップできます。これにより、restore()コールを最終的にブロックに配置し、何が起こっても実行されることを確認(rèn)できます。

または、より良い方法は、sinon.test()を使用してテスト機(jī)能をラップすることです

上記の例では、IT()の2番目のパラメーターはsinon.test()にラップされていることに注意してください。 2番目に注意すべきことは、sinon.stub()の代わりにthis.stub()を使用することです。

sandbox

関數(shù)を使用できます。およびシミュレーション。サンドボックスを使用して作成されたテストの順調(diào)には、

自動(dòng)的に
var user = {
  ...
  setName: function(name){
    this.name = name;
  }
}

//為 setName 函數(shù)創(chuàng)建一個(gè)間諜
var setNameSpy = sinon.spy(user, 'setName');

//現(xiàn)在,每當(dāng)我們調(diào)用該函數(shù)時(shí),間諜都會(huì)記錄有關(guān)它的信息
user.setName('Darth Vader');

//我們可以通過查看間諜對(duì)象來查看
console.log(setNameSpy.callCount); //輸出:1

//重要最后一步 - 刪除間諜
setNameSpy.restore();
クリーンアップされます。

上記の例のコードにはstub.restore()がないことに注意してください。テストがサンドボックス化されているため、不要です。

可能な場(chǎng)合は、sinon.test()を使用する場(chǎng)合、エラーのためにテストスタンドアロンをクリーンアップせずに、テストがランダムに失敗し始めた問題を回避できます。

sinonは魔法ではありません

Sinonは多くの操作を?qū)g行し、それがどのように機(jī)能するかを理解するのが難しい場(chǎng)合があります。 Sinonがどのように機(jī)能するかについての簡単なJavaScriptの例を見てみましょう。そうすれば、それが內(nèi)部でどのように機(jī)能するかをよりよく理解できます。これは、さまざまな狀況でより効率的に使用するのに役立ちます。

スパイ、スタブ、シミュレーションを手動(dòng)で作成することもできます。 Sinonを使用する理由は、タスクを些細(xì)なものにすることです。手動(dòng)で作成することは非常に複雑ですが、Sinonが何をするかを理解するためにどのように機(jī)能するかを見てみましょう。

まず、スパイは基本的に関數(shù)ラッパーです:

var spy = sinon.spy();

//我們可以像函數(shù)一樣調(diào)用間諜
spy('Hello', 'World');

//現(xiàn)在我們可以獲取有關(guān)調(diào)用的信息
console.log(spy.firstCall.args); //輸出:['Hello', 'World']

カスタム関數(shù)を使用してSPY機(jī)能を簡単に取得できます。しかし、Sinonのスパイは、アサーションサポートを含む、より広範(fàn)な機(jī)能を提供していることに注意してください。これにより、シノンはより便利になります。

スタブはどうですか?

非常にシンプルなスタブを作成するには、機(jī)能を新しい関數(shù)に置き換えることができます。

var user = {
  ...
  setName: function(name){
    this.name = name;
  }
}

//為 setName 函數(shù)創(chuàng)建一個(gè)間諜
var setNameSpy = sinon.spy(user, 'setName');

//現(xiàn)在,每當(dāng)我們調(diào)用該函數(shù)時(shí),間諜都會(huì)記錄有關(guān)它的信息
user.setName('Darth Vader');

//我們可以通過查看間諜對(duì)象來查看
console.log(setNameSpy.callCount); //輸出:1

//重要最后一步 - 刪除間諜
setNameSpy.restore();
しかし、シノンのスタブにはいくつかの利點(diǎn)があります:

    フルスパイ機(jī)能
  • が含まれています
  • stub.restore()
  • を使用して元の動(dòng)作を簡単に復(fù)元できます
  • Sinon Stubsに対して主張することができます
シミュレーションは、スパイとスタブの動(dòng)作を単純に組み合わせて、機(jī)能をさまざまな方法で使用できるようにします。

Sinonは時(shí)々「魔法」がたくさんあるように見えますが、ほとんどの場(chǎng)合、これはあなた自身のコードで簡単に実行できます。シノンは、その目的のために獨(dú)自のライブラリを書く必要があるのではなく、使用がはるかに便利です。

結(jié)論

実際のコードのテストは、複雑すぎるように見えることがあり、完全に簡単にgiveめることができます。しかし、Sinonでは、ほぼすべてのタイプのコードをテストすることが簡単になります。

主な原則を覚えておいてください:機(jī)能がテストの書き込みを困難にしている場(chǎng)合は、テストの代役に置き換えてみてください。この原則は、機(jī)能が何を?qū)g行しても適用されます。

獨(dú)自のコードでシノンを適用する方法を知りたいですか?私のウェブサイトにアクセスしてください。シノンのベストプラクティスの3つの実際の例と、さまざまな種類のテスト狀況でそれを適用する方法を含む無料の実世界のシノンガイドをお送りします。

Sinon.jsテスト(FAQ)

に関する FAQ

sinon.jsの模擬、スパイ、スタブの違いは何ですか?

Sinon.jsでは、模擬、スパイ、スタブの用途が異なります。スパイとは、パラメーターと呼ばれるすべてのパラメーター、返品値、この値、およびスローされた例外(ある場(chǎng)合)を記録する関數(shù)です。これらは、関數(shù)呼び出しと応答を追跡するために使用できます。スタブはスパイに似ていますが、事前にプログラムされた動(dòng)作があります。また、それらがどのように呼ばれるかについての情報(bào)を記録しますが、スパイとは異なり、メソッドの動(dòng)作を制御してメソッドを強(qiáng)制してエラーを投げたり、特定の値を返したりできます。シミュレーションは、事前にプログラムされた動(dòng)作(スタブなど)と事前にプログラムされた期待(SPYなど)を備えた誤った方法です。

javascriptでの単體テストにsinon.jsを使用する方法は?

sinon.jsは、JavaScriptテストでスパイ、スタブ、モックを作成するための強(qiáng)力なツールです。それを使用するには、最初にHTMLでスクリプトタグを使用するか、NPM経由でインストールしてプロジェクトに含める必要があります。含まれると、APIを使用して、スパイ、スタブ、モックを作成および管理できます。これらを使用して、テストしているコードを分離し、予想どおりに機(jī)能することを確認(rèn)できます。

sinon.jsでスパイを作成する方法は?

sinon.jsでスパイを作成するのは簡単です。 sinon.spy()関數(shù)を呼び出すだけです。これにより、テストで使用できるスパイ関數(shù)が返されます。 SPYはそれを呼び出す方法に関する情報(bào)を記録し、それをテストでチェックインすることができます。たとえば、スパイが何回呼び出されるか、それを呼び出すために使用されるパラメーター、およびそれが返すものを確認(rèn)できます。

sinon.jsでスタブを作成する方法は?

Sinon.jsでスタブを作成するには、sinon.stub()関數(shù)を呼び出す必要があります。これにより、テストで使用できるスタブ関數(shù)が返されます。スタブはスパイのように振る舞い、それを呼び出す方法に関する情報(bào)を記録しますが、その動(dòng)作を制御することもできます。たとえば、スタブをスローにエラーにするか、特定の値を返すことができます。

sinon.jsで模擬を作成する方法は?

sinon.jsで模擬の作成には、sinon.mock()関數(shù)を呼び出すことが含まれます。これにより、テストで使用できる模擬オブジェクトが返されます。模擬オブジェクトはスパイのように動(dòng)作し、それを呼び出す方法に関する情報(bào)を記録し、スタブに似ているため、その動(dòng)作を制御できます。しかし、それはあなたがそれをどのように呼ぶかについての期待を設(shè)定することを可能にします。

他のテストフレームワークでsinon.jsを使用する方法は?

sinon.jsは、JavaScriptテストフレームワークとともに使用するように設(shè)計(jì)されています。スタンドアロンテストフレームワークを提供しますが、Mocha、Jasmine、Qunitなどの他の一般的なテストフレームワークと統(tǒng)合することもできます。 Sinon.JSドキュメントは、これらおよびその他のテストフレームワークとの統(tǒng)合の例を提供します。

スタブまたはスパイを元の機(jī)能に復(fù)元する方法は?

関數(shù)をスタブまたはスパイに置き換えた場(chǎng)合、スタブまたはスパイの.Restore()メソッドを呼び出すことにより、元の関數(shù)を復(fù)元できます。これは、テスト後にクリーンアップして、スタブやスパイが他のテストに影響しないことを確認(rèn)する場(chǎng)合に役立ちます。

特定のパラメーターでスパイが呼び出されたかどうかを確認(rèn)する方法は?

sinon.jsは、スパイを呼び出す方法を確認(rèn)するいくつかの方法を提供します。たとえば、.calledwith()メソッドを使用して、特定のパラメーターでスパイが呼び出されたかどうかを確認(rèn)できます。 .calledoncewith()メソッドを使用して、特定のパラメーターでスパイが1回だけ呼び出されたかどうかを確認(rèn)することもできます。

スタブを特定の値に返す方法は?

.returns()メソッドを使用して、スタブを特定の値に戻すことができます。たとえば、Mystubという名前のスタブがある場(chǎng)合は、mystub.returns( 'foo')を呼び出すことで値「foo」を返すことができます。

スタブをスローする方法はエラーですか?

.throws()メソッドを使用して、スタブをエラーにすることができます。たとえば、Mystubという名前のスタブがある場(chǎng)合は、mystub.throws()を呼び出すことでエラーを投げることができます。デフォルトでは、これによりエラーオブジェクトがスローされますが、エラーの名前をパラメーターとして渡すことにより、エラーを特定のタイプのエラーにすることもできます。

以上がSinonチュートリアル:模擬、スパイ、スタブを使用したJavaScriptテストの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

node.jsでHTTPリクエストを作成する方法は? node.jsでHTTPリクエストを作成する方法は? Jul 13, 2025 am 02:18 AM

node.jsでHTTPリクエストを開始するには、組み込みモジュール、axios、およびnode-fetchを使用する3つの一般的な方法があります。 1.依存関係のない內(nèi)蔵http/httpsモジュールを使用します。これは基本的なシナリオに適していますが、https.get()を使用してデータを取得したり、.write()を介してPOSTリクエストを送信するなど、データステッチとエラーモニタリングの手動(dòng)処理が必要です。 2.Axiosは、約束に基づいたサードパーティライブラリです。簡潔な構(gòu)文と強(qiáng)力な機(jī)能を備えており、非同期/待ち聲、自動(dòng)JSON変換、インターセプターなどをサポートします。非同期リクエスト操作を簡素化することをお?jiǎng)幛幛筏蓼埂?3.Node-Fetchは、約束と単純な構(gòu)文に基づいて、ブラウザフェッチに似たスタイルを提供します

JavaScriptデータ型:プリミティブ対參照 JavaScriptデータ型:プリミティブ対參照 Jul 13, 2025 am 02:43 AM

JavaScriptデータ型は、プリミティブタイプと參照タイプに分割されます。プリミティブタイプには、文字列、數(shù)字、ブール、ヌル、未定義、シンボルが含まれます。値は不変であり、コピーは値を割り當(dāng)てるときにコピーされるため、互いに影響を與えません。オブジェクト、配列、関數(shù)などの參照タイプはメモリアドレスを保存し、同じオブジェクトを指す変數(shù)は互いに影響します。 TypeofとInstanceOFを使用してタイプを決定できますが、TypeOfNullの歴史的な問題に注意してください。これらの2種類の違いを理解することは、より安定した信頼性の高いコードを書くのに役立ちます。

JavaScript Timeオブジェクト、誰かがEACTEXE、Google Chromeなどのより高速なWebサイトを構(gòu)築します。 JavaScript Timeオブジェクト、誰かがEACTEXE、Google Chromeなどのより高速なWebサイトを構(gòu)築します。 Jul 08, 2025 pm 02:27 PM

こんにちは、JavaScript開発者!今週のJavaScriptニュースへようこそ!今週は、DenoとのOracleの商標(biāo)紛爭、新しいJavaScript Timeオブジェクトがブラウザ、Google Chromeアップデート、およびいくつかの強(qiáng)力な開発ツールによってサポートされています。始めましょう! 「JavaScript」の商標(biāo)を登録しようとするDeno Oracleの試みとのOracleの商標(biāo)紛爭は、論爭を引き起こしました。 Node.jsとDenoの作成者であるRyan Dahlは、商標(biāo)をキャンセルするために請(qǐng)願(yuàn)書を提出しました。

キャッシュAPIとは何ですか?また、サービスワーカーでどのように使用されますか? キャッシュAPIとは何ですか?また、サービスワーカーでどのように使用されますか? Jul 08, 2025 am 02:43 AM

Cacheapiは、ブラウザからネットワークリクエストをキャッシュするツールです。これは、ウェブサイトのパフォーマンスとオフラインエクスペリエンスを改善するために、サービスワーカーと併用することがよくあります。 1.開発者は、スクリプト、スタイルシート、寫真などのリソースを手動(dòng)で保存できるようにします。 2。要求に応じてキャッシュ応答と一致させることができます。 3.特定のキャッシュの削除またはキャッシュ全體のクリアをサポートします。 4.フェッチイベントを聞いているサービスワーカーを介して、キャッシュの優(yōu)先順位またはネットワークの優(yōu)先戦略を?qū)g裝できます。 5.オフラインサポート、繰り返しのアクセス速度の高速化、主要なリソースのプリロード、バックグラウンドアップデートコンテンツによく使用されます。 6.それを使用する場(chǎng)合、キャッシュバージョンの制御、ストレージ制限、およびHTTPキャッシングメカニズムとの違いに注意する必要があります。

ハンドリングの約束:javascriptのチェーン、エラー処理、および約束の組み合わせ ハンドリングの約束:javascriptのチェーン、エラー処理、および約束の組み合わせ Jul 08, 2025 am 02:40 AM

約束は、JavaScriptで非同期操作を処理するためのコアメカニズムです。チェーンコール、エラー処理、コンビナーの理解は、アプリケーションをマスターするための鍵です。 1.チェーンコールは、.then()を通じて新しい約束を返し、非同期プロセスの連結(jié)を?qū)g現(xiàn)します。それぞれ.then()は以前の結(jié)果を受け取り、値または約束を返すことができます。 2。エラー処理は、.catch()を使用して例外をキャッチしてサイレント障害を回避し、キャッチのデフォルト値を返すためにプロセスを継続する必要があります。 3。promise.all()などの組み合わせ(すべての成功後にのみ成功しました)、promise.race()(最初の完了が返されます)、promise.allsettled()(すべての完了を待っています)

JavaScriptでのデータ操作のためのArray.Prototypeメソッドを活用します JavaScriptでのデータ操作のためのArray.Prototypeメソッドを活用します Jul 06, 2025 am 02:36 AM

.map()、.filter()、.reduce()などのJavaScriptアレイ內(nèi)蔵メソッドは、データ処理を簡素化できます。 1).map()は、要素を1つに変換して新しい配列を生成するために使用されます。 2).filter()は、條件ごとに要素をフィルタリングするために使用されます。 3).reduce()は、データを単一の値として集約するために使用されます。使用すると誤用を避ける必要があり、その結(jié)果、副作用やパフォーマンスの問題が発生します。

JSラウンドアップ:JavaScriptイベントループに深く潛り込む JSラウンドアップ:JavaScriptイベントループに深く潛り込む Jul 08, 2025 am 02:24 AM

JavaScriptのイベントループは、コールスタック、WebAPIS、およびタスクキューを調(diào)整することにより、非同期操作を管理します。 1.コールスタックは同期コードを?qū)g行し、非同期タスクに遭遇すると、処理のためにWebAPIに引き渡されます。 2。WebAPIがバックグラウンドでタスクを完了した後、コールバックを?qū)潖辘工毳濠`(マクロタスクまたはマイクロタスク)に入れます。 3.イベントループは、コールスタックが空であるかどうかをチェックします??栅螆?chǎng)合、コールバックはキューから取り出され、実行のためにコールスタックに押し込まれます。 4.マイクロタスク(Promise.thenなど)は、マクロタスク(SettimeOutなど)より優(yōu)先されます。 5.イベントループを理解するには、メインスレッドのブロックを避け、コード実行順序を最適化するのに役立ちます。

JavaScript DOMイベントでのイベントの泡立ちとキャプチャの理解 JavaScript DOMイベントでのイベントの泡立ちとキャプチャの理解 Jul 08, 2025 am 02:36 AM

イベントの泡は、ターゲット要素から祖先ノードに外側(cè)に伝播し、イベントキャプチャは外側(cè)の層からターゲット要素に內(nèi)側(cè)に伝播します。 1。イベントバブル:子要素をクリックした後、イベントは親要素のリスナーを上向きにトリガーします。たとえば、ボタンをクリックした後、最初に保育を出してから、親クリックしました。 2。イベントキャプチャ:3番目のパラメーターをtrueに設(shè)定して、リスナーが[親子要素のキャプチャリスナー]をクリックする前に[親要素のキャプチャリスナーをトリガーするなど、キャプチャステージで実行されるようにします。 3.実用的な用途には、子どもの要素イベントの統(tǒng)一された管理、傍受前処理、パフォーマンスの最適化が含まれます。 4. DOMイベントストリームは、キャプチャ、ターゲット、バブルの3つの段階に分割され、デフォルトのリスナーはバブルステージで実行されます。

See all articles