Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用jasmine模拟函数调用_Javascript_Angularjs_Unit Testing_Jasmine_Hottowel - Fatal编程技术网

Javascript 使用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

开始使用模板,我正在设置单元测试。遇到了障碍

我试图在我的控制器中测试一个函数,它碰巧调用了另一个名为“log”的函数。这个“log”是一个存储在私有变量中的函数,它从一个名为“common”的依赖项获取其值

我知道我可能需要以某种方式来存根这个函数,但是我不确定这个特定的例子从哪里开始,因为我对angularjs、jasmine等等都是新手。欢迎提出任何意见

单元测试

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');