如何在Sinon JS的单元测试中处理sinon.stub()。throws()

时间:2016-09-08 09:52:32

标签: angularjs unit-testing ecmascript-6 sinon chai

我试图在我的代码段中调用fail条件。 但是当我使用sinon.stub().throws()方法时它会显示错误。 我无法在代码中处理它。 这是我的代码:

login() {
    let loginData = this.loginData;
    return this.authService.login(loginData).then(userData => {

      let msg = `${this.niceToSeeYouAgain} ${userData.email}!`;
      this.userAlertsService.showSuccessToast(msg);
      this.navigationService.afterLoggedIn();

      //above lines are covered in test cases

    }, errorInfo => {
      // below line are needed to test
      this.userAlertsService.showAlertToast(errorInfo);
    });
}

**这是我的单元测试片段:**

it('.login() - should throw exception - in failure case', sinon.test(() => {

    let errorInfo = "some error";

    let stub = sinon.stub(authService, 'login').throws();

    let spy1 = sinon.spy(controller.userAlertsService, 'showAlertToast');


    //call function
    controller.login();
    // $timeout.flush();

    // expect things
    console.log(stub.callCount, stub.args[0]);

  }));

请让我知道出错了什么

2 个答案:

答案 0 :(得分:0)

这个问题在这个答案中已经有一个月了,但是我遇到了类似的错误,Google也没有对此行为做出任何解释。我也想测试登录的失败分支,stub.throws()实际上抛出错误(导致测试失败),而不是拒绝登录承诺。如果有人知道为什么会这样,我会很感激。

无论如何,这对我有用:

let d = Q.defer();          // Or whichever promise library you use
d.reject();                 // Force the promise to fail
let stub = sinon.stub(authService, 'login').returns(d.promise);    // Should do what you want
// The rest of the test

答案 1 :(得分:0)

您需要包装您知道将要失败的函数,然后call它。 e.g。

it('handles errors in methodThatCallsAnotherFailingMethod', function() {
  error = new Error("some fake error");
  sandbox.stub(SomeObject, "doSomething").throws(error);

  call = function() {
    // methodThatCallsAnotherFailingMethod calls SomeObject.doSomething()
    methodThatCallsAnotherFailingMethod();
  };

  expect(call).to.throw(Error);

});

methodThatCallsAnotherFailingMethod中测试(或监视)其他内容时,您可以在测试中执行此操作:

  try {
    call();
   } catch (error) {
    expect(MySpy).to.have.been.calledWith(error);
  }