对作为参数

时间:2016-08-09 21:01:24

标签: javascript angularjs unit-testing jasmine

我有一个控制器,我有一个接受表单的保存方法。

ctrl.save = function(form) {
        if (!form.$valid) return;
    ...
}

这对于使用表单非常方便,因为我可以根据其有效性,状态等轻松访问值并执行某些操作。

if(form.someField.$dirty) { ... }

我使用这种方法开发了大量代码,并且在考虑单元测试之前没有遇到任何问题。有没有办法可以使用一些Angular模拟对象轻松地模拟表单,或者这是一种糟糕的方法?我关心访问该方法中的表单的部分原因是该表单有多个部分,每个部分根据其状态独立调用服务器。换句话说,我不会打电话来更新没有改变的东西。记住这一点,这是一种糟糕的方法吗?我可以采用哪种替代方法来对这种保存方法进行单元测试?

1 个答案:

答案 0 :(得分:0)

我不确定这是否是解决这个问题的一个很好的解决方案,但它似乎有效,让我可以模拟表单,而无需独立处理所有的HTML。

beforeEach(function () {
        //Set up a mocked form
        formMock = {
            $valid: false,
            firstName: { $dirty: false, $viewValue: '' },
            lastName: { $dirty: false, $viewValue: '' },
            emailAddress: { $dirty: false, $viewValue: '' },
            password: { $dirty: false, $viewValue: '' },
            address: { $dirty: false, $viewValue: '' },
            city: { $dirty: false, $viewValue: '' },
            selectedState: { code: '' },
            zip: { $dirty: false, $viewValue: '' }
        };

    });

然后在我的测试中,我只是将这个对象传递给期望表单的方法。

it('should do the stuff', function() {
    ctrl.save(formMock);
    expect(mockedService.spiedMethod).toHaveBeenCalled();
}

我意识到这不是一个有角度的模拟对象,但似乎只要包含控制器/服务所期望的属性,就可以在评估测试条件之前设置这些值并进行更改。

it('should do the stuff', function() {
    formMock.firstName.$viewValue = 'Hello';
    ctrl.save(formMock);
    expect(mockedService.spiedMethod).toHaveBeenCalled();
}

在我的情况下,我正在测试spied方法中对传入的值起作用的条件,我真的只关心基于我提供的条件,spied方法是,或者没有被调用。