相同字符串上的Jasmine错误,“预期...等于......”

时间:2015-09-23 01:32:02

标签: angularjs typescript jasmine karma-jasmine

我收到此错误,但我检查并测试了字符串,它们完全相同:

Expected { $$state : { status : 1, value : { customerNumber : 'customerNumber', name : 'name', userId : 'buId', customerType : 'type', address : 'displayAddress' } } } 
to equal { $$state : { status : 1, value : { customerNumber : 'customerNumber', name : 'name', userId : 'buId', customerType : 'type', address : 'displayAddress' } } }.
Error: Expected { $$state : { status : 1, value : { customerNumber : 'customerNumber', name : 'name', userId : 'buId', customerType : 'type', address : 'displayAddress' } } } to equal { $$state : { status : 1, value : { customerNumber : 'customerNumber', name : 'name', userId : 'buId', customerType : 'type', address : 'displayAddress' } } }.
        at C:/customerServiceSpec.js:70

我唯一能注意到的是最后有一个句号,但我认为Jasmine在回复中添加了这个。这是我的测试代码:

describe('CustomerService', () => {
    var mockUserSession: any = {};
    var testService any = {};
    var $q: ng.IQService;
    var createCustomerDetailsService;
    var customerDetailsService;
    var createResolvedPromise;
    var createRejectedPromise;
    var resolvePromises;

    var testResponse = {
        customers: {
            displayCustomerNumber: 'customerNumber',
            name: 'name',
            id: 'id',
            type: 'type',
            displayAddress: 'displayAddress'
        }
    };

    var serviceResponse={
        $$state: {
            status: 1,
            value: {
                customerNumber: 'customerNumber',
                name: 'name',
                id: 'id',
                customerType: 'type',
                address:'displayAddress'
            }
        }
    };

    var rootScope;

    beforeEach(() => {
        module('app.customer');

        inject(( _$q_, $injector) => {
            this.$q = _$q_;
            rootScope = $injector.get('$rootScope');

            createResolvedPromise = (result) => {
                return () => {
                    return this.$q.when(result);
                };
            };

            resolvePromises = () => {
                rootScope.$digest();
            };

            createCustomerDetailsService = () => {
                return new app.customer.CustomerService(
                    testService);
            };
        });

    });

    it('WILL search by customer ID and return a customers details', () => {
        var searchResponsePromise;

        testService.getCustomerDetails = jasmine.createSpy("getCustomerDetails").and.callFake(createResolvedPromise(testResponse));
        customerDetailsService = createCustomerDetailsService();
        searchResponsePromise = customerDetailsService.getCustomerDetails('12345678');
        resolvePromises();

        expect(searchResponsePromise).toEqual(serviceResponse);
    });
});

这是我的服务:

public getCustomerDetails(customerID:string): ng.IPromise<ICustomerDetails> {
    return this.testService.getCustomerDetails(customerID).then((customerResponse:ICustomerResult) => {

        var customer = customerResponse.customers;

        var customerDetailsResult:ICustomerDetails = {
            customerNumber: customer.displayCustomerNumber,
            name: customer.name,
            userId: customer.buId,
            customerType: customer.type,
            address: customer.displayAddress
        };

        return customerDetailsResult;
    });
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这是因为json对象实际上是对象的不同实例,但它们包含相同的数据。你需要做这样的事情:

expect(angular.equals(searchResponsePromise, serviceResponse)).toBe(true);

答案 1 :(得分:-1)

有关执行此操作的首选方式,请参阅AngularJS + Jasmine: Comparing objects。从本质上讲,您希望使用expect(...).toEqual(...)而不是expect(...).toBe(...)toEqual()进行深入比较。

在接受的答案上执行此操作的优点是,toBe(true)失败的断言的错误只会说明expected false to be true的某些内容,这不足以解决问题

toEqual()执行的深度比较将导致包含预期和实际对象的断言错误,序列化为字符串。它使解决问题变得更好,更容易。 :)