私は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
と言っています
編集:より良いアプローチについては basecode answer を見てください
ドキュメントから 、次のように使用する必要があります。
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();
});
ユースケースを見ると、ここでtoHaveBeenCalled
を使用することはお勧めできません。 toHaveBeenCalled
は、テストコールバック(非同期)またはモックと組み合わせたい場合に便利です。
Auth.prototype.Login
内で発生するすべてのことを、「外界」からは見えない実装の詳細と見なします。実装の詳細はテストしないでください。これは2つの質問を引き起こします。
リファクタリングが難しくなります。何らかの理由でAuth.prototype.isEmpty
をunderscore.isEmpty
に置き換えたいとします。数日後、underscore
を完全に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');
});
});
基本的にその使い方は簡単です:-
spyOn(<name_of_the_object>, '<name_of_the_method>')
expect(<name_of_the_object>.<name_of_the_method>).toHaveBeenCalled();