16

私はjasmineここに慣れていないので、クラスsrcを作成するファイルですAuth

function Auth() {
}

Auth.prototype.isEmpty = function(str) {
    return (!str || 0 === str.length);
}

Auth.prototype.Login = function (username , password) {
    if (this.isEmpty(username) || this.isEmpty(password)) {
        return "Username or Password cann't be blank ";
    }
    else {
        return "Logged In !";
    }
}

toHaveBeenCalled()今、私はジャスミンのマッチャーをテストしたい. ここに私が書くものがあります

it("should be able to Login", function () {
    spyOn(authobj);
    expect(authobj.Login('abc', 'abc')).toHaveBeenCalled();
});

しかし、それは言うundefined() method does not exist

4

3 に答える 3

25

ユースケースを見ると、ここでの使用はお勧めできませんtoHaveBeenCalledtoHaveBeenCalledテスト コールバック (非同期) が必要な場合、またはモックと組み合わせて使用​​する場合に役立ちます。

内部で発生するすべてのことAuth.prototype.Loginを、「外界」からは見えない実装の詳細と考えてください。実装の詳細をテストするべきではありません。これにより、2 つの質問がトリガーされます。

実装の詳細をテストしてはいけないのはなぜですか?

リファクタリングが難しくなります。Auth.prototype.isEmpty何らかの理由でを置き換えたいとしましょうunderscore.isEmptyunderscore数日後、完全に に置き換えることにしましたlodash。これにより、テストを 3 回変更する必要があります。簡単にリファクタリングするのを妨げるものはすべて「ダメ」と考えてください。

代わりに何をテストしますか?

公開 API。「外界」に見えるものすべて。あなたの場合は「ログインしました!」です。および「ユーザー名またはパスワードを空白にすることはできません」。

これにより、3 つのテストが行​​われます。

describe('Login', function() {

 it('returns "success" string when username and password are not empty', function() {
   expect(new Auth().Login('non-empty', 'non-empty')).toBe('Logged In !');
 });

 it('returns "failure" string when username is empty', function() {
   expect(new Auth().Login('', 'non-empty')).toBe('Username or Password cannot be blank');
 });

 it('returns "failure" string when password is empty', function() {
   expect(new Auth().Login('non-empty', '')).toBe('Username or Password cannot be blank');
 });

});
于 2013-05-31T07:07:57.543 に答える
18

編集:より良いアプローチについては、ベースコードの回答を見てください


docs から、次のように使用する必要があります。

spyOn(foo, 'setBar');

it("tracks that the spy was called", function() {
  expect(foo.setBar).toHaveBeenCalled();
});

したがって、次のように書く必要があります。

it("should be able to Login", function () {
  spyOn(authobj, 'isEmpty');  
  authobj.Login('abc', 'abc');  
  expect(authobj.isEmpty).toHaveBeenCalled();
});
于 2013-05-28T08:32:39.497 に答える
0

基本的に使い方は簡単です: -

spyOn(<name_of_the_object>, '<name_of_the_method>')

expect(<name_of_the_object>.<name_of_the_method>).toHaveBeenCalled();
于 2014-12-29T08:42:57.183 に答える