在 Angularjs/Jasmine 测试中测试数据库响应

Testing a database response in an Angularjs/Jasmine test

我正在尝试对 jasmine 中的 angular 工厂进行单元测试,但我无法理解如何从我的数据库中获取实际响应。

我有以下工厂代码,它根据公司代码值检索包含公司信息的对象。

工厂工作正常,但我想在 jasmine 中测试它。

    app.factory('adminOps',function($http, $log, $q){
      return {
        getByTicker: function(ticker){

            return $http.post("http://localhost:3000/ticker", {"ticker": ticker})
            .then(function(response){
                if (typeof response.data === 'object') {
                    return response.data;
                } else {
                    return $q.reject(response.data);
                }

            }, function(response) {
                return $q.reject(response);
            });
        }
      };
    });

为了对此进行测试,我根据找到的在线示例编写了以下 jasmine 代码。

describe('adminOps', function() {
  var factory, http;

  beforeEach(module('myApp'));
  beforeEach(inject(function(_adminOps_, $httpBackend) {
    factory = _adminOps_;
    http = $httpBackend;
  }));

  it('Should retrieve company data', function(done) {
    var testCompany = function(company) {
      expect(company.name).toBe("Google Inc.");
    };

    var failTest = function(error) {
      expect(error).toBeUndefined();
    }

    http.expectPOST('http://localhost:3000/ticker',{ticker:"GOOG"}).respond(200, {ticker:"GOOG"});

    factory.getByTicker("GOOG")
      .then(testCompany)
      .catch(failTest)
      .finally(done);

    http.flush();
  });
});

我得到一个Expected undefined to be 'Google Inc.'

如何调用我的工厂并测试我发送的代码参数的正确名称值?

更新:Koen 的代码可以正常工作。我发现如果你想在服务器上测试值,比如休息 api,那么你应该尝试像 frisby 这样的东西,它是基于 Jasmine 构建的。

单元测试应该测试你的本地代码,不应该有外部依赖。因此,您的测试不会也不应该实际访问您的数据库。

$httpBackend 允许您模拟 http 请求和响应。

您的代码模拟 $httpBackend 如下:

http.expectPOST('http://localhost:3000/ticker',{
    ticker:"GOOG"
}).respond(200,{
    ticker:"GOOG"
});

表示它将以

的响应进行响应
{ticker:"GOOG"}

因此它没有您需要的 'name' 属性。

测试 'getByTicker' 方法的正确方法是使用以下 $httpBackend 设置:

$http.expectPOST('http://localhost:3000/ticker', {
  ticker: "GOOG"
}).respond(200, {
  name: "Google Inc."
});