gpt4 book ai didi

javascript - Jasmine spy 调用的问题

转载 作者:行者123 更新时间:2023-12-01 04:08:33 24 4
gpt4 key购买 nike

我在调用实际实现时遇到问题,并且收到此错误:

TypeError: undefined is not an object (evaluating 'GitUser.GetGitUser('test').then') ...

这是我的代码:

app.controller('HomeController', ['$scope', 'GitUser', function ($scope, GitUser) {
$scope.name = "user";

GitUser.GetGitUser('test').then(function (data) {
console.log(data);
if (data) {
$scope.name = data;
}
});
}]);
app.factory('GitUser', function ($http) {
return {
GetGitUser: function (username) {
return $http.get('https://api.github.com/users/' + username)
.then(function success(response) {
return response.data.login;
});
}
};
});

这是我的单元测试:

describe('HomeController Unit Test', function () {
var $controllerConstructor, scope;

beforeEach(module("AngularApp"));

beforeEach(inject(function ($controller, $rootScope) {
$controllerConstructor = $controller;
scope = $rootScope.$new();
}));

it('should test if scope.name is test', function () {
// Act
GitUser = {
GetGitUser: function () { }
};

spyOn(GitUser, "GetGitUser").and.callThrough();

GitUser.GetGitUser();

$controllerConstructor('HomeController', {
'$scope': scope,
'GitUser': GitUser
})

// Assert
expect(GitUser.GetGitUser).toHaveBeenCalled();
expect(scope.name).toBe('test');
});
});

最佳答案

这个问题比缺少注入(inject)要复杂一些......这是调整后的测试:

https://plnkr.co/edit/ZMr0J4jmLPtDXKpRvGBm?p=preview

有几个问题:1)您正在测试一个返回 promise 的函数 - 因此您还需要以这种方式模拟它(例如使用 return $q.when(..) )。

2)您正在尝试测试创建 Controller 时发生的代码 -

GitUser.GetGitUser('test').then(function (data) {
console.log(data);
if (data) {
$scope.name = data;
}
});

应该包裹在一个函数中:

function init() {
GitUser.GetGitUser('test').then(function (data) {
console.log(data);
if (data) {
$scope.name = data;
}
});
}

然后使其在您的范围内可用:

scope.init= init;

然后在您的测试中调用该函数并验证您的断言。如果您不将其包装在函数中,它将无法测试。

另外 - 模拟和 callThrough 的事情...当您测试 Controller (而不是服务)时,您可以使用 callFake 代替 - callFake 函数可以返回一个带有值的 Promise(您想要验证的值)稍后) - 然后您可以确保拼图的 Controller 部分正常工作。

  var name = 'test';
// instead of trying to mock GitUser you can just callFake and be sure to return a promise
spyOn(GitUser, "GetGitUser").and.callFake(function() {
return $q.when(name);
});

我希望这一切都有道理 - 骗子应该把事情说清楚 - 我会在那里添加更多评论。

关于javascript - Jasmine spy 调用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41645857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com