【问题标题】:Testing a database response in an Angularjs/Jasmine test在 Angularjs/Jasmine 测试中测试数据库响应
【发布时间】:2015-09-10 12:21:12
【问题描述】:

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

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

工厂工作正常,但我想在茉莉花中进行测试。

    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 的代码可以正常工作。我发现如果你想在服务器上测试值,比如 rest api,那么你应该尝试像 frisby 这样的东西,它是基于 Jasmine 构建的。

【问题讨论】:

  • 单元测试使用 mock $httpBackend。这个 mock $httpBackend 不发送任何请求。它恰好用于避免发送 http 请求。它只回答单元测试告诉它回答的内容。

标签: angularjs unit-testing jasmine karma-jasmine


【解决方案1】:

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

$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."
});

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    相关资源
    最近更新 更多