2016-07-07 3 views
1

私は角度サービスを持っています。このサービスの中には、サービス上の別の関数を参照する関数を持つオブジェクトがあります。 (以下コード)私は、オブジェクトの関数が呼び出されるとき、それは実際に本当の関数を呼び出すことを確認するために、私のサービス機能をスパイするためにジャスミン(1.3)を使用したいジャスミン:関数参照でspyOnの後に実関数が呼び出されます

私の問題:spyOnを呼び出した後、実際の機能はまだ呼び出されています。

FooService.js

angular.module('foo').service("FooService", function() { 
    var self = this; 

    this.fooFunction = function() { 
     console.log("Foo function is being called"); 
    } 

    this.bar = { 
     barFunction : self.fooFunction 
    } 
}); 

FooService-spec.js

describe("Testing FooService", function() { 
    var service; 

    beforeEach(inject(function(_FooService_) { 
     service = _FooService_; 
    })); 

    describe("Test bar object", function() { 
     it("should call fooFunction when bar.barFunction is called", function() { 
      spyOn(service, "fooFunction"); 
      service.bar.barFunction(); 
      expect(service.fooFunction).toHaveBeenCalled(); 
     }); 
    }); 
}); 

私は次のようにFooServce.jsを変更した場合、このすべてがしかし働くことを発見した:

FooService - ワーキング

angular.module('foo').service("FooService", function() { 
    var self = this; 

    this.fooFunction = function() { 
     console.log("Real function is being called"); 
    } 

    this.bar = { 
     barFunction : function() { 
      return self.fooFunction(); 
     } 
    } 
}); 

JavaScript/Angular/Jasmineのどの部分を最初の例で理解できませんか?

答えて

0

spyOnは異なる値を持つオブジェクトのプロパティの値を置換することによって動作します。あなたがspyOn(service, "fooFunction");を行うと、あなたは、この値service.fooFunctionを変更しないことに注意してください

var realFunc = service.fooFunction; 
service.fooFunction = function() { 
    doSpyStuff(); 
    return realFunc.apply(this, arguments); 
} 

ような何かをやっています。これは実際には serviceを変更します。つまり、 serviceのプロパティの1つがまったく異なる関数になりました。この置換は fooFunctionプロパティの serviceにのみ影響します。 serviceのプロパティにアクセスしていない場合、あなたは確かにスパイ機能を呼び出すあなたの方法ではありません。

それでは、あなたの場合には、この知識を適用しましょう。テストでは、service.barのプロパティにアクセスしています。 service.bar.barFunctionservice.fooFunctionはもともと同じ値でしたが、serviceはそのfooFunctionプロパティがスパイに置き換えられましたが、(非常に重要なことに)service.barspyOnによってそのプロパティが変更されていません。あなたがservice.bar.barFunction()を呼び出すときは、直接、実際の関数を呼び出し、そしてservicefooFunctionプロパティに住んでいるスパイに接続されていません。匿名関数としてbarFunction: function() { return self.fooFunction(); }を行う際にスパイを保持しているプロパティである、ここでselfserviceであることを起こるので、self.fooFunctionservice.fooFunctionであるため、これとは対照的に

は、あなたが実際には、service上のスパイプロパティ値にアクセスしています交換価値。

+0

私はそれがこれらの行に沿ったものだと考えました。とにかくこれらをテストするには? – Mistrog

+0

@Mistrogあなたは、関数値ではなく、プロパティを偵察しているので、呼び出したい正確なオブジェクト/プロパティを偵察する必要があります。または、動作する2番目の例にあるパターンを使用します。 – apsillers

関連する問題