我正在为Angular应用程序编写一些测试,这是我第一次尝试使用Jasmine进行Angular的单元测试。我无法构建测试以满足函数内部的各种场景(即if语句和回调)。
这是我的$ scope函数,它将Object作为参数,如果该对象有id
,则它更新对象(因为它已经存在),否则它会创建一个新的报告,使用CRUD
服务推送到后端。
$scope.saveReport = function (report) {
if (report.id) {
CRUD.update(report, function (data) {
Notify.success($scope, 'Report updated!');
});
} else {
CRUD.create(report, function (data) {
$scope.report = data;
Notify.success($scope, 'Report successfully created!');
});
}
};
到目前为止,我的测试传递了一个带有id
的伪对象,因此它会触发CRUD.update
方法,然后我会调用该方法。
describe('$scope.saveReport', function () {
var reports, testReport;
beforeEach(function () {
testReport = {
"id": "123456789",
"name": "test"
};
spyOn(CRUD, 'update');
$scope.saveReport(testReport);
});
it('should call CRUD factory and update', function () {
expect(CRUD.update).toHaveBeenCalledWith(testReport, jasmine.any(Function));
});
});
我理解Jasmine不允许多个间谍,但我希望能够以某种方式测试if条件,并在Object 不传递给Object时运行模拟测试太:
describe('$scope.saveReport', function () {
var reports, testReport;
beforeEach(function () {
testReport = {
"id": "123456789",
"name": "test"
};
testReportNoId = {
"name": "test"
};
spyOn(CRUD, 'update');
spyOn(CRUD, 'create'); // TEST FOR CREATE (NoId)
spyOn(Notify, 'success');
$scope.saveReport(testReport);
$scope.saveReport(testReportNoId); // TEST FOR NO ID
});
it('should call CRUD factory and update', function () {
expect(CRUD.update).toHaveBeenCalledWith(testReport, jasmine.any(Function));
// UNSURE ON THIS PART TOO
});
});
我已经阅读了有关使用.andCallFake()
方法的内容,但我看不出这对我的设置有何影响。任何帮助真的很感激。
答案 0 :(得分:1)
您似乎应该首先确定需要测试的内容。如果你想简单地测试当id存在时调用更新,或者在没有id时调用create,那么你应该只使用这些条件构造it函数。对于某些事情来说,之前的每个人都是错误的地方。
it('should call CRUD factory and update', function () {
spyOn(CRUD, 'update');
$scope.saveReport(testReport);
expect(CRUD.update).toHaveBeenCalledWith(testReport, jasmine.any(Function));
});
it('should call CRUD create', function() {
spyOn(CRUD, 'create');
$scope.saveReport(testReportNoId); // TEST FOR NO ID
expect(CRUD.create).toHaveBeenCalledWith(testReport, jasmine.any(Function));
});
在每次测试之前,只需将事物放在每个实际应该做的事情之前。
希望这有帮助!