javascript - AngularJS 服务单元测试在 toEqual 上失败

标签 javascript angularjs jasmine karma-runner

我有以下 Jasmine 单元测试:

describe('getAlertsByUserId', function () {
    it('should get alerts from api/Alert/bob when the username is bob', inject(function (AlertService, $httpBackend) {
        $httpBackend.when('GET', 'api/Alert/bob').respond(mockAlerts);
        var alerts = AlertService.getAlertsByUserId('bob');
        $httpBackend.flush();
        expect(alerts).toEqual(mockAlerts);
    }));
});

mockAlerts 定义如下:

[{
        date: new Date(2013, 5, 25),
        description: '',
        alertType: 'type1',
        productDescription: 'product',
        pack: 12,
        size: 16,
        unitOfMeasure: 'OZ',
        category: 'cat1',
        stage: 'C',
        status: 'I'
}]

当我在 Karma 中执行测试时,我得到“Expected [ {date:...etc }] to equal [ {date:...etc }]。我已经验证了两个对象是相同的(属性/值)。我尝试删除 Date 对象,但无济于事。有人吗?

最佳答案

toEqual 将检查引用是否相等,即警报对象与 mockAlerts 是同一对象。您要检查的是对象相等性。有几种方法可以做到这一点。

首先你可以将你的对象转换成json

expect(JSON.stringify(alerts)).toEqual(JSON.stringify(mockAlerts));

这可能在大多数情况下都有效,但它确实取决于序列化程序以完全相同的方式处理对象。

另一种方法是使用 angular.equals。

expect(angular.equals(alerts, mockAlerts)).toBeTruthy();

这可能不太好读,但应该能很好地工作。

关于javascript - AngularJS 服务单元测试在 toEqual 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17433447/

相关文章:

javascript - 如何使用onclick将html中的元素数量相乘

javascript - AngularJS 和 jQuery-UI Sortable 不起作用

javascript - 更新来自react-with-firebase-auth的用户

javascript - 在某些其他范围对象的 ng-repeat 中使用另一个范围对象值

html - 无法访问 $scope 模型

angularjs - 模拟 promise 链函数

javascript - 当 child 在 CSS 中获得焦点时如何更改父样式

angularjs - 使用 JWT 进行 Laravel 身份验证时出现 Satellizer 警告 "Expecting a token named token"

javascript - Jasmine 在 expect().toThrow 上抛出错误,而不是识别抛出的错误

node.js - 在 Webstorm 中运行 jasmine 测试会在跟踪中停止,退出代码为 0