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 !";
    }
}

现在我想测试 jasmine 的toHaveBeenCalled()matcher 。这是我写的

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

但它说undefined() method does not exist

4

3 回答 3

25

查看您的用例,我不建议toHaveBeenCalled在此处使用。toHaveBeenCalled在您想要测试回调(异步)或与模拟结合使用的情况下很有用。

将内部发生的所有事情都Auth.prototype.Login视为对“外部世界”不可见的实现细节。您不应该测试实现细节。这引发了两个问题。

为什么我不应该测试实现细节?

它使重构变得困难。假设您Auth.prototype.isEmpty出于某些原因想要替换为underscore.isEmpty. 几天后,您决定underscore完全替换为lodash. 这将迫使你改变你的测试三次。将阻止您轻松重构的所有事情都视为“不可行”。

我应该测试什么?

公共 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 回答