javascript - Karma + Jasmine 测试异步方法

标签 javascript jasmine karma-jasmine

我有以下 Controller :

export default function($scope, $state, $http) {
    $scope.login = () => {
        $scope.loginFailed = false;

        const postReq: object = {
            method: 'POST',
            url: `/login`,
            data: {},
        }

        try {
            console.log('$scope.login');

            const response = await $http(postReq);

            console.log('login done');

            console.log('$state.go');

            $state.go('dashboard');

            return true;
        } catch(err) {
            console.error(err);
            $scope.loginFailed = true;

            return false;
        }
    };
}

我正在尝试用 Jasmine 测试这个方法

it('change state to dashboard', async (done) => {
    $httpBackend.expectPOST('/login', undefined).respond(201, { rmId: 123123 });

    await $scope.login();
    expect($state.current.name).toBe('dashboard');
});

我的测试结果如下:

LOG: '$scope.login' PhantomJS 2.1.1 (Mac OS X 0.0.0) $scope.login change state to dashboard FAILED

现在看来,Jasmine 并没有等待 $http 调用完成。 (当我在浏览器中手动测试它时,效果很好)

是否有更好的方法来正确测试异步方法?

最佳答案

你不需要等待。你只需要在等待测试之前刷新后端模拟 您的登录功能必须更改如下:

$scope.login = () => {
       return new Promise((resolve, reject) => {
          $scope.loginFailed = false;

        const postReq = {
            method: 'POST',
            url: `/login`,
            data: {},
        }

        const response = $http(postReq).then(
          (success) => {
              $state.go('dashboard');
              resolve(true);
            },
            (error) => {
               $scope.loginFailed = true;

            reject(false);
            });
       });
    };

你的测试如下:

it('change state to dashboard', async (done) => {
    const  backendMock = $httpBackend;
    backendMock.expectPOST('/login').respond(201, { rmId: 123123 });
    $scope.login().then((response) => {
      expect($state.current.name).toBe('dashboard');
      done();
    });
    backendMock.flush();

});

关于javascript - Karma + Jasmine 测试异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51738422/

相关文章:

angularjs - Visual Studio 中的 Angular 单元测试失败

javascript - 需要 Karma : Uncaught Error: jasmine. Suite()

Angular 7 测试重试当模拟 http 请求无法实际重试时

javascript - 如何使用 Zurb Foundation 4 填充网格行?

javascript - 从 Razor 获取模型数据并传递到 knockout 文件

javascript - 垂直居中部分 svg 内容

javascript - Express用户认证中间件,应该做多少事情?

node.js - 如何使用 jasmine-node 监视 Node 模块中的私有(private)函数?

typescript - 使用 Typescript 创建自定义 Jasmine 匹配器

javascript - 使用 Jasmine 测试 ajax 请求内的 Angular 范围变量