【问题标题】:Mock a $http.put result of an angular model - unit test模拟角度模型的 $http.put 结果 - 单元测试
【发布时间】:2015-12-03 14:07:43
【问题描述】:

我有这个测试:

测试:

describe('Ao iniciar uma entrevista por id', function () {

        it('deve deve utilizar diretorio raiz da aplicacao', inject(function (Questionario) {
            expect(Questionario.urlEntrevistaPorId).toContain(raiz);
        }));

        it('deve atualizar modelo', inject(function (Questionario, $httpBackend) {
            var entrevistaNova = { a: 1, b: 2 };
            $httpBackend.expectPUT(Questionario.urlEntrevistaPorId, { estudoId: idEstudo, entrevistaId: 666 }).respond({
                Entrevista: entrevistaNova,
                PaginaAtual: novaPagina
            });
            Questionario.iniciarEntrevista(666);
            spyOn(Questionario, 'setEntrevista');
            $httpBackend.flush();
            expect(Questionario.setEntrevista).toHaveBeenCalledWith(entrevistaNova, novaPagina);
        }));

    });

模型角度:

function iniciarEntrevista(id) {
            var _this = this;
            return $http
                .put(this.urlEntrevistaPorId, { estudoId: idEstudo, entrevistaId: id })
                .success(function (result) {
                    if (result.Iniciada) {
                        _this.setEntrevista(result.Entrevista, result.PaginaAtual);
                        return true;
                    }
                    else {
                        return false;
                    }                 
                });
        }

调用 Questionario.iniciarEntrevista 并等待调用 setEntrevista。但是由于 $http.put 的返回,这个方法没有被调用。

我需要 result.Iniciada 是真的。

如何模拟这个?

【问题讨论】:

  • 尝试将 200 代码添加到响应中。像这样:.respond(200,{})
  • 我发现使用 spyOn($http, 'post').and.returnValue($q.when(myData)); 模拟 $http 对象更容易
  • 看起来您在响应处理程序中的if (result.Iniciad) 条件可能是问题所在。收到响应时,您正在检查此属性,但您似乎没有在模拟响应数据中传递该属性。

标签: javascript angularjs unit-testing jasmine angular-mock


【解决方案1】:

使用它的一种方法是使用$httpBackend

您也有一些示例,基本上您将 $httpBackend 注入到您的测试控制器中,并将其映射到请求。您在提供的链接中有一些示例,我认为从这里可以直截了当。

Here is a tutorial 里面还有一个 plunker 链接。

【讨论】:

    【解决方案2】:

    我明白了!

    只是在 $httpBackend.expectPUT 上添加了 Iniciada : true 行

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 2017-09-04
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多