Jasmine测试一种方法,用于设置以不同方法描述的变量

时间:2016-06-17 19:22:15

标签: angularjs jasmine

棱角分明和茉莉花新手。我有一个save()方法,我想在我正在测试的控制器中进行单元测试。它设置了一些我之前做过select()时定义的变量(基本上是在我的UI上单击行时调用的方法)。这是片段:

function select(row){

        vm.selected.row = row;
        vm.someValue = false;
}

现在我有了save()

这个功能
function save(){

        if(vm.selected.row == 1)
        { 
            //doSomething 
        }
        vm.someSaveValue = vm.someValue; // assigning vm.someSaveValue to the value I set to false in select method above
}

但是如果我为Save()方法编写单元测试,我将无法访问我在select()方法中创建的变量。任何线索如何实现? 这是我的示例测试代码段

describe('Test someValue setting', function(){
            it('test someValues', function (done) {
                vm.save().then(function () {
                    spyOn(vm.select)  // maybe this way, but how to access the variables this sets to ??????

                    expect(vm.someValue).toEqual('true');
                });
                scope.$apply();
                done();
            });

        });

显然,当我运行我的测试时,它会到达我的主控制器方法save(),但错误地说It vm.selected.row is undefined并失败。有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

你要做的不是单元测试。您应该单独测试save()函数。如果它依赖于来自另一个函数的某些值,则它不再是单元测试。

要在if块内部进行测试,您应手动设置vm.selected.row的值。同样适用于vm.someValue。您应该测试vm.SomeSaveValue的值是您期望的值,而不是vm.someValue的值。这是我的意思的一个例子:

it('should set the value of vm.SomeSaveValue to false', function() {
    vm.someSaveValue = true;
    vm.someValue = false;
    vm.selected.row = 2;

    vm.save()

    expect(vm.SomeSaveValue).toEqual(false);
}

或者在if区块内测试一些内容,例如:

it('should do something', function() {
    vm.selected.row = 1;

    vm.save();

    expect('something done in if block').toBe('some value');
}

这将从测试中删除对select函数的任何依赖性。如果您的保存功能实际调用了select(),那么您应该使用间谍和and.CallFake()选项。

答案 1 :(得分:0)

在调用save之前调用另一个方法。

describe('Test someValue setting', function(){
        it('test someValues', function (done) {
            vm.select(1);
            vm.save().then(function () {
                spyOn(vm.select)  // maybe this way, but how to access the variables this sets to ??????

                expect(vm.someValue).toEqual('true');
            });
            scope.$apply();
            done();
        });

    });