Javascript 使用jasmine模拟函数调用
开始使用模板,我正在设置单元测试。遇到了障碍 我试图在我的控制器中测试一个函数,它碰巧调用了另一个名为“log”的函数。这个“log”是一个存储在私有变量中的函数,它从一个名为“common”的依赖项获取其值 我知道我可能需要以某种方式来存根这个函数,但是我不确定这个特定的例子从哪里开始,因为我对angularjs、jasmine等等都是新手。欢迎提出任何意见 单元测试:Javascript 使用jasmine模拟函数调用,javascript,angularjs,unit-testing,jasmine,hottowel,Javascript,Angularjs,Unit Testing,Jasmine,Hottowel,开始使用模板,我正在设置单元测试。遇到了障碍 我试图在我的控制器中测试一个函数,它碰巧调用了另一个名为“log”的函数。这个“log”是一个存储在私有变量中的函数,它从一个名为“common”的依赖项获取其值 我知道我可能需要以某种方式来存根这个函数,但是我不确定这个特定的例子从哪里开始,因为我对angularjs、jasmine等等都是新手。欢迎提出任何意见 单元测试: describe("quote", function () { var scope, control
describe("quote", function () {
var scope,
controller,
common;
beforeEach(inject(function($rootScope, $controller, _common_) {
scope = $rootScope.$new();
common = _common_;
controller = $controller;
}));
describe("removeAttachment", function() {
it("should remove the attachment when requested", function() {
var vm = controller("quote", { $scope: scope });
vm.attachmentList.push({ FileName: "file1", FileAsString: "..." });
vm.attachmentList.push({ FileName: "file2", FileAsString: "..." });
vm.attachmentList.push({ FileName: "file3", FileAsString: "..." });
expect(vm.attachmentList.length).toEqual(3);
// here's the call where it fails
vm.removeAttachment(vm.attachmentList[1]);
expect(vm.attachmentListCount).toEqual(2);
expect(vm.attachmentList.length).toEqual(2);
expect(vm.attachmentList[1].FileName).toBe("file3");
});
});
});
控制器:
var getLogFn = common.logger.getLogFn;
var log = getLogFn(controllerId);
function removeAttachment(attachment) {
// need to stub this out
log('removing attachment: ' + attachment.FileName);
vm.attachmentList.splice(vm.attachmentList.indexOf(attachment), 1);
vm.attachmentListCount = vm.attachmentList.length;
}
茉莉花的错误:
TypeError:“undefined”不是一个函数(计算“log”(“删除附件:“+attachment.FileName”)是否在删除附件之前调用
var log=getLogFn(controllerId)
?getLogFn()是否已注入控制器?如果这两个都是真的,那么可以去掉getLogFn()以返回一个可以用于测试的虚拟日志对象。我不知道热毛巾,我用。我会打电话给你
var getLogFnStub=sinon.stub().returns(函数(msg){return 1;/*我的预期结果*/})代码>
然后把它传给你的控制器,就像
var vm=controller(“quote”,{$scope:scope,getLogFn:getLogFnStub})代码>
如果您愿意,您可以对您在中创建的存根进行断言,如下所示
在removeAttachment之前是否调用了var log=getLogFn(controllerId)
?getLogFn()是否已注入控制器?如果这两个都是真的,那么可以去掉getLogFn()以返回一个可以用于测试的虚拟日志对象。我不知道热毛巾,我用。我会打电话给你
var getLogFnStub=sinon.stub().returns(函数(msg){return 1;/*我的预期结果*/})代码>
然后把它传给你的控制器,就像
var vm=controller(“quote”,{$scope:scope,getLogFn:getLogFnStub})代码>
如果您愿意,您可以对您在中创建的存根进行断言,如下所示
在测试中,您应该有controller=$contoller(“YourController”{it's dependencies})
您可能不想传入公共服务,而是创建一个返回函数的存根
var wrapper = {logger: function () {}};
var stub = { logger: { getLogFun: function() {return wrapper.logger} }};
你可以通过它来代替你的公共服务
您现在可以通过以下方式监视它:
spyOn(wrapper, 'logger');
在测试中,您应该有controller=$contoller(“YourController”{it's dependencies})
您可能不想传入公共服务,而是创建一个返回函数的存根
var wrapper = {logger: function () {}};
var stub = { logger: { getLogFun: function() {return wrapper.logger} }};
你可以通过它来代替你的公共服务
您现在可以通过以下方式监视它:
spyOn(wrapper, 'logger');