javascript - 试图理解 Jasmine 的 toHaveBeenCalled() 匹配器

标签 javascript unit-testing bdd jasmine

我是 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() 匹配器。这是我写的

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

但是它说 undefined() 方法不存在

最佳答案

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

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

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

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

我应该测试什么?

公共(public) 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');
 });

});

关于javascript - 试图理解 Jasmine 的 toHaveBeenCalled() 匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16787351/

相关文章:

javascript - jquery.i18n.properties 不工作

javascript - 子菜单在屏幕调整大小时无法正确呈现(以及意外行为)

C# 单元测试中如何过滤非断言异常

ios - Calabash - 如何比较标签中给定 ID 的文本?

javascript - 类型错误 : Cannot read property 'args' when creating spy with Jasmine

bdd - 给出何时然后测试 - 我需要 "When"吗?

javascript - divs/spans/p/img/a/tr/td/ul/li 等的正确名称

c# - 从 NUnit TestContext 检索测试持续时间

.net - 使 NUnit 在第一次失败时不停止

当 API http 请求出现 json 错误(未找到)时,javascript 警报不起作用