0

我正在使用 Mocha、Chai 和 Sinon 来测试我的 Angular 代码。

我在一个名为 update 的函数中有一些代码需要测试

function update() 
//... Irrelevant code to the question asked 
        DataService.getEventsData(query).then(function (res) {


            var x = res.results;
            addTabletoScope(x); // Want to check that this is called. 
            vm.tableState.pagination.numberOfPages = Math.ceil(res.resultsFound / vm.tableState.pagination.number);


            vm.isLoading = false;


            vm.count++;

        });

所有这些代码都在更新函数中。这一切都在我目前正在测试的控制器中。

当我在测试中调用 scope.update() 时,我想确保调用了 scope.addTabletoScope(x)。

在我运行测试之前的 beforeEach 中,我有一个间谍

spy = sinon.spy(scope, 'addTabletoScope'); 

因为该函数绑定到范围。

这是我运行的一项测试。

it('Expects adding to scope to be called', function(){
        $httpBackend.whenPOST(APP_SETTINGS.GODZILLA_EVENTS_URL)
            .respond(res.data);
        scope.tableState = tableState;
        scope.update();
        $httpBackend.flush();
        expect(spy.called).to.be.true; 
    })

这失败了,因为 spy.call 是假的。

我尝试的另一件事是

it('Expects adding to scope to be called', function(){
        $httpBackend.whenPOST(APP_SETTINGS.GODZILLA_EVENTS_URL)
            .respond(res.data);
        scope.tableState = tableState;
        scope.update();
        scope.$apply(); 
        $httpBackend.flush();
        expect(spy.called).to.be.true; 
    })

这也行不通。我哪里错了?

4

1 回答 1

0

在浏览了 MochaJS 文档后,我很快就明白了。

如果我有带有承诺或任何异步行为的函数,在我调用表现出该行为的函数之后,我应该将 done 参数传递给该测试中的匿名函数,然后像这样调用 done:

it('Expects adding to scope to be called', function(done){
        $httpBackend.whenPOST(APP_SETTINGS.GODZILLA_EVENTS_URL)
            .respond(res.data);
        scope.tableState = tableState;
        scope.update();
        done();
        $httpBackend.flush();
        expect(spy.called).to.be.true;
    })

这行得通。

于 2015-09-10T16:15:22.140 回答