使用Karma和Jasmine对d3.csv()进行单元测试失败

时间:2014-06-02 22:47:35

标签: angularjs d3.js karma-runner

我正在开发一个Angular应用程序,我正在使用Jasmine编写单元测试和Karma作为测试运行器。

我们正在使用D3进行可视化。

我从后端服务接收文件“testData.csv”中的csv数据,并使用d3.csv(“testData.csv”)将CSV数据加载到变量中,例如“data”。然后使用d3.csv.parse(data)从CSV数据中获取JSON数组。

我想为这些编写单元测试,但它们都失败了。任何帮助都非常适合。

我的Karma conf:

    files: [
        'jquery-2.0.3/jquery.js',
        'angular-1.2.4/angular.js',
        'angular-1.2.4/angular-route.js',
        'angular-1.2.4/angular-mocks.js',
        'projectExternal/d3/d3.v3.min.js',  // included D3 library
        'scripts/**/*.js',
        'test/unit/**/*.js'
    ],

我的Jasmine单元测试:

    'use strict';

    describe('D3 Page', function () {
        var ctrl = null;
        var scope = null;
        var data;
        var dataJson;

        // load the controller's module
        beforeEach(module('app'));

        beforeEach(inject(function ($controller, $rootScope, $injector, $compile) {
            scope = $rootScope.$new();
            ctrl = $controller('D3Ctrl', {
                $scope: scope
            });
        }));

        afterEach(function() {

        });

        it('should parse csv data', function(){
            expect(d3.csv).toBeDefined();  // passes
            d3.csv("testData.csv", function(dataset) {
                console.log("CSV data is: " + dataset); // prints null
                data = dataset;
            });

           console.log(data); // prints null

            var ds = d3.csv.parse(data);
            expect(ds.length).toBe(3);   // prints ds.length = 0, fails Expected 0 to be 3
    //      console.log(ds); // prints null

        });
    });

1 个答案:

答案 0 :(得分:2)

d3.csv是异步的,所以你需要以这种方式处理它。

尝试这样的事情:

it('should parse csv data', function(){
    expect(d3.csv).toBeDefined();    // passes
    d3.csv("/absolute/path/to/testData.csv", function(error, dataset) {
        if (error) {
            console.log("Error: " + error);
        } else {
            console.log("Data: " + data);
        }
        console.log("CSV data is: " + dataset); // prints null
        data = dataset;
        console.log(data);           // prints null
        var ds = d3.csv.parse(data);
        expect(ds.length).toBe(3);   // prints ds.length = 0, fails Expected 0 to be 3
    });
});