【问题标题】:TypeError: 'undefined' is not a function (evaluating 'moment()')TypeError:“未定义”不是函数(评估“时刻()”)
【发布时间】:2016-03-22 20:41:30
【问题描述】:

我在控制器中使用moments.js 设置日期值。尝试针对它运行规范时出现以下错误:

TypeError: 'undefined' is not a function (evalating 'moment()')

我不关心测试值是否设置正确,我只想定义日期值以允许测试继续进行。模拟这个的最好方法是什么?我已尝试按照相关问题中的建议使用 jasmine.clock(),但测试仍在尝试评估 moment()。理想情况下,我可以在每次测试之前将 controller.date 设置为任意值以进行测试。

这是我的控制器中的代码(在控制器初始化时调用设置日期):

function setDate() {
  controller.date = {
      startDate: moment().subtract(1, "days").hour(0).minute(0).second(0),
      endDate: moment()
  };
}

编辑:

这是相关的控制器代码:

.controller('OrderListCtrl', function ($rootScope, $state, $stateParams, $uibModal, $q, orders, Orders, Product, Store, Payments, params) {

        var controller = this;

        // set default values for datepicker - beginning of yesterday until current time today
        controller.setDate = function() {
          controller.date = {
              startDate: moment().subtract(1, "days").hour(0).minute(0).second(0),
              endDate: moment()
          };
        }

        controller.setDate();
    });

这是相关的规范代码:

describe("OrderController", function() {

    var orderController, deferred, params, scope, state, stateParams, uibModal, q, controller, moment;

    beforeEach(inject(function ($controller, $rootScope, $q, $uibModal) {
        scope = $rootScope.$new();
        q = $q;
        controller = $controller;
        uibModal = $uibModal;

        deferred = $q.defer();

        orderController = controller('OrderListCtrl', {
            $rootScope: scope,
            $state: state,
            $stateParams: stateParams,
            $uibModal: uibModal,
            $q: q
        });

        orderController.setDate = function() {
          orderController.date = {
            startDate: new Date('01/01/2016'),
            endDate: new Date('01/02/2016')
          }
        }

    }));

尝试以这种方式覆盖 setDate() 方法显然不起作用,它仍然抛出错误:“找不到时刻变量”。

【问题讨论】:

  • Date 对象和moment 对象是两个不同的东西。你为什么要在一个实例中使用Date 对象而在另一个实例中使用moment 对象?
  • 你试过在 beforeEach(inject()) 中注入时刻吗?
  • MVCE 真的会帮助我们帮助您。

标签: angularjs mocking jasmine momentjs


【解决方案1】:

你不能只选择自己使用的日期吗?

function setDate() {
  controller.date = {
      startDate: new Date('01/01/2016'),
      endDate: new Date('01/02/2016')
  };
}

【讨论】:

  • 当我尝试在规范中使用它时,它没有被拾取。
  • 哦,我看错了你的帖子,对不起。那么为什么不在初始化控制器之后在测试中设置日期属性呢?
猜你喜欢
  • 2018-08-04
  • 2014-01-01
  • 2015-03-30
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2014-09-13
  • 2018-08-27
相关资源
最近更新 更多