Javascript SinonJS-调用存根之前的属性值

Javascript SinonJS-调用存根之前的属性值,javascript,angularjs,sinon,Javascript,Angularjs,Sinon,我目前正在使用中进行存根。 从我所看到的情况来看,使用库可以存根和监视方法,但不能监视属性 在下面的示例中,是否有方法检查状态。searchText已设置为状态。在调用提交之前,建议 // currently using angular but applies equally to vanilla js $scope.searchSuggestion = function() { this.state.searchText = this.state.suggestio

我目前正在使用中进行存根。 从我所看到的情况来看,使用库可以存根和监视方法,但不能监视属性

在下面的示例中,是否有方法检查
状态。searchText
已设置为
状态。在调用
提交之前,建议

   // currently using angular but applies equally to vanilla js
   $scope.searchSuggestion = function() {
        this.state.searchText = this.state.suggestion;
        this.submit();
    };
理想测试代码:

it('should set the searchText to be the suggestion', function(){
        // arrange
        sinon.stub(scope, 'submit');
        scope.state.searchText = 'old value';
        scope.state.suggestion = 'new value';
        // act
        scope.searchSuggestion();
        // assert
        expect(scope.submit.called).to.be(true) 
        // ~not sure how to see if searchText was set first
    });

我只是在处理一个类似的问题,所以尽管这是一个很老的问题,我还是回答了

对我有效的方法是将函数替换为执行断言的函数,如下所示:

it('should set the searchText to be the suggestion', function(){
    scope.state.searchText = 'old value';
    scope.state.suggestion = 'new value';

    scope.submit = function() {
      expect(whatever).to.equal(somethingElse);
    };

    scope.searchSuggestion();
});

这样,当调用submit时,您可以使用任何您想要的断言来检查前提条件。缺点是您可能需要添加一些额外的代码来处理恢复原始函数的操作,如果该函数从未被调用,测试将顺利通过-因此您可能需要添加一个
done()
回调来以防万一。

不确定为什么要将
sinon
angularjs
一起使用。AngularJS已经成为一个可测试的框架,它使单元测试变得非常容易。在您的案例中,在调用
searchSuggestion()
后的最后或刚刚调用
expect(scope.state.searchText).toBe(scope.state.suggestion)
行中添加
searchText
以便查看
searchText是否有新值。希望有帮助。是的,检查它是否改变不是问题。我想测试它在调用
submit
之前是否已更改。Sinon.js是一个存根框架。与AngularJS结合使用非常有用。在本例中使用它允许be检查
submit
是否被调用
expect(scope.submit.called).to.be(true)