8

使い始めたばかりsinon.jsで、用語に完全に困惑しています。subview'srender メソッドがスタブ化されているスタブを使用しました。しかし、スパイの説明は私には明確ではありません。これら2つの違いを正確に説明できる人はいますか?

また、新しいモデルがコレクションに追加されたかどうかをテストしたい場合、どのようなアプローチになるのだろうかと思っていましたか?

4

1 に答える 1

10

私はあまり詳しくありませんsinon.jsが、これらは一般的な TDD 用語であり、sinon 固有のものではないため、あなたの質問に答えることができると思います。

主な違いは、スタブが純粋に「コードを通過する」ために存在することです。スタブ自体は、ダミーの値とメソッドを保持する以外には何もしません。

一方、スパイは、それらに入れられる値、またはそれらに対して呼び出されるメソッドをチェックするスタブです。つまり、2 つの主な違いは assert ステートメントです。スタブには何もありませんが、スパイにはいくつかあります (または、アサートの値をテスト コードの別の場所に格納します)。

言い換えると:

var Stub = Backbone.Model.extend();
var stub = new Stub({value: 'test value'});
// This can be fed to any view for testing

var Spy = Backbone.Model.extend({
    initialize: function() {
        this.on('change:value', this.handleValueChange);
    },
    handleValueChange: function(value) {
        assert(!isNaN(value));
    };
    value: 'test value'
});
var spy = new Spy({value: 'test value'});
// This can be fed to any view for testing AND it ensures that,
// if that view sets its "value", that that value is a number

ああ、そして答えるために:

また、新しいモデルがコレクションに追加されたかどうかをテストしたい場合、どのようなアプローチになるのだろうかと思っていましたか?

繰り返しますが、特に Sinon には触れませんが、モデルを「スパイ」できる明らかな場所が 2 つあります。それは、モデル自体とそのコレクションです。

モデルにイベント ハンドラーを追加する (またはモデルのテスト メソッドにハード ワイヤする) ことで、this.collectionコレクションが追加されたかどうか、またはどのコレクションに追加されたかを判断できます。逆に、イベントをバインドするか、コレクション自体のメソッドを上書きして、this.models.

于 2013-01-24T00:19:55.687 に答える