1

angular-translate を呼び出す AngularJS サービスの単体テストを作成するさまざまな方法を試しましたが、うまくいきません。アドバイスをいただければ幸いです。これが私の最も有望な例です:

(function() {
    var app = angular.module("theApp", ["pascalprecht.translate"]);

    var theService = function($translate) {
        var theFunction = function(data) {
            return $translate("FOO", { input: data.in }).then(function(trans) {
                data.out = trans;
            });
        };

        return {
            theFunction: theFunction
        };
    };

    app.factory("theService", ["$translate", theService]);
}());

describe("theService", function() {
    beforeEach(module("theApp", function($translateProvider, $provide) {
        $translateProvider.useLoader('customLoader');
        $provide.service('customLoader', function($q) {
            return function() {
                var deferred = $q.defer();
                deferred.resolve({
                    "FOO": "foo {{input}}"
                });
                return deferred.promise;
            };
        });
    }));

    it("function translates input", inject(function($rootScope, theService) {
        var data = { in: "bar", out: "fail" };
        theService.theFunction(data);
        $rootScope.$apply();
        expect(data.out).toBe("foo bar");
    }));
});

JSFiddle はここにあります: http://jsfiddle.net/danBhentschel/q71r874t/

4

1 に答える 1

2

わかった。私は自分でそれを理解したと思います。私はここにあるテストから始めました:

https://github.com/angular-translate/angular-translate/blob/master/test/unit/service/translate.spec.js#L409

そして、この合格したテストを自分がやりたいことへとゆっくりと変形させることができました。

(function() {
    var app = angular.module("theApp", ["pascalprecht.translate"]);

    var theService = function($translate) {
        var theFunction = function(data) {
            return $translate("FOO", { input: data.in }).then(function(trans) {
                data.out = trans;
            });
        };

        return {
            theFunction: theFunction
        };
    };

    app.factory("theService", ["$translate", theService]);
}());

describe("theService", function() {
    var $rootScope;

    beforeEach(module("theApp", function($translateProvider, $provide) {
        $translateProvider.useLoader("customLoader");
        $provide.service("customLoader", function($q) {
            return function() {
                var deferred = $q.defer();
                deferred.resolve({
                    "FOO": "foo {{input}}"
                });
                return deferred.promise;
            };
        });
    }));

    beforeEach(inject(function ($translate, _$rootScope_) {
        $rootScope = _$rootScope_;
        $translate.use("en_US");
        $rootScope.$apply();
    }));

    it("function translates input", inject(function(theService) {
        var data = { in: "bar", out: "fail" };
        theService.theFunction(data);
        $rootScope.$apply();
        expect(data.out).toBe("foo bar");
    }));
});

ソリューションを含む JSFiddle は、http://jsfiddle.net/danBhentschel/yLt3so14/ にあります

私が犯した愚かな間違いを指摘してください。私はまだこれに慣れていません。

于 2015-01-06T15:17:07.510 に答える