title: Angular Unit Testing on Controller using a Service - Breaking on Inject
body: <p>I am writing a unit test for karma and can't get it to run.  It seems to be breaking on the inject function.  I think it has to do with how I get the controller in the test, but cannot find a solution.</p>
  
  <p>I just started using angular in the last few days so any advice would be appreciated, thanks!</p>
  
  <p><strong>Error:</strong></p>
  
  <pre><code>Error: Argument 'fn' is not a function, got string
    at Error (&lt;anonymous&gt;)
    at $a (path/app/lib/angular.js:16:453)
    at qa (path/app/lib/angular.js:17:56)
    at Cb (path/app/lib/angular.js:24:458)
    at Object.d [as invoke] (path/app/lib/angular.js:27:66)
    at path/app/lib/angular.js:26:194
    at Array.forEach (native)
    at m (path/app/lib/angular.js:6:192)
    at e (path/app/lib/angular.js:25:298)
    at Object.sb [as injector] (path/app/lib/angular.js:29:360)
  TypeError: Cannot read property 'zip' of undefined
    at null.&lt;anonymous&gt; (path/test/unit/controllersSpec.js:26:19)
  </code></pre>
  
  <p><strong>Test:</strong></p>
  
  <pre><code>'use strict';
  
  /* jasmine specs for controllers go here */
  
  describe('influences controllers', function() {
    beforeEach(module('influences.controllers', ['ui.bootstrap', 'influences.services']));
  
    describe('IndividualCtrl', function(){
  
      var scope, ctrl, service, $httpBackend;
  
      beforeEach(inject(function(_$httpBackend_, $rootScope, $controller, Api_sunlight_get) {
        console.log('*** IN INJECT!!***: ', Api_sunlight_get);
        $httpBackend = _$httpBackend_;
        // ignore for now... this is an example of how I might implement this later
        // $httpBackend.expectGET('data/products.json').
        //     respond([{name: 'Celeri'}, {name: 'Panais'}]);
  
        scope = $rootScope.$new();
        service = Api_sunlight_get;
        ctrl = $controller('IndividualCtrl', {$scope: scope, Api_sunlight_get: service
        });
      }));
  
      it('should create "products" model with 2 products fetched from xhr', function() {
        console.log('*** IN TEST!!***: ', scope);
        expect(scope.zip).toEqual(12345);
      });
    });
  });
  </code></pre>
  
  <p><strong>Controller:</strong></p>
  
  <pre><code>angular
    .module('influences.controllers', ['ui.bootstrap', 'influences.services'])
    .controller('IndividualCtrl', ['$scope', 'Api_sunlight_get', ($scope, Api_sunlight_get)-&gt;
      # set default variables
      $scope.zip = $scope.zip or 94102  # set default zip if one is not chosen
  
      # Define Methods
      $scope.get_rep_data_by_zip = ()-&gt;
        $scope.reps =  Api_sunlight_get "legislators/locate?zip=#{$scope.zip}" $scope.update_rep_data_by_zip
  
      $scope.update_rep_data_by_zip = ()-&gt;
        $scope.selected_rep = $scope.reps  # sets default selection for reps buttons
        for rep in $scope.reps
          rep.fullname = "" + rep.title + " " + rep.first_name + " " + rep.last_name
  
      # watchers
      $scope.$watch('zip', $scope.get_rep_data_by_zip)
  
      # initial run
      $scope.get_rep_data_by_zip()
  </code></pre>
  
  <p><strong>Service:</strong></p>
  
  <pre><code>angular
    .module('influences.services', [])
    .factory 'Api_sunlight_get', ['$http', ($http)-&gt;
      return (path, callback)-&gt;
        $http
          url: "http://congress.api.sunlightfoundation.com/#{path}&amp;apikey=xxxx"
          method: "GET"
        .success (data, status, headers, config)-&gt;
          callback data.results
        .error (data, status, headers, config)-&gt;
          console.log("Error pulling #{path} from Sunlight API!")
    ]
  </code></pre>