2013-10-30 8 views
6

私のジャスミンユニットテストで使用する名前、電子メールなどの単純な定数値を提供したいと思います。anglejs/jasmine unit-testsに再利用可能なサンプルデータ値を提供するには

同様の質問がここに頼まれた:AngularJS + Karma: reuse a mock service when unit testing directives or controllers

をC#で、私はモックデータの小さな断片を保持するための静的クラスを作成します。

static class SampleData 
{ 
    public const string Guid = "0e3ae555-9fc7-4b89-9ea4-a8b63097c50a"; 
    public const string Password = "3Qr}b7_N$yZ6"; 

    public const string InvalidGuid = "[invalid-guid]"; 
    public const string InvalidPassword = "[invalid-password]"; 
} 

私はカルマ/ジャスミンを使用して、私のAngularJSアプリをテストするときと同じ利便性を持っていると思います。私は、このように、私のユニットテストを通じて、これらの値を使用することができます。

私はこのように、私はすでに、私は実際のコードで使用した定数のためにこれを行う、私は私の角度のアプリに対してconstantオブジェクトを定義することができることを知っている:

myApp.constant('config', {apiUrl:'http://localhost:8082'}) 

私はちょうどこのように別の定数を追加することができますが、

myApp.constant('sampleData', {email: '[email protected]'}) 

私は、ちょうどこの

のように、私のテストと私は行くオフにモック一定のオブジェクトを挿入できます。これだけのように、私のユニットテストで使用するためのサンプルデータ値を含みます
describe 'A sample unit test', -> 
    beforeEach -> module 'myApp' 
    beforeEach inject ($injector) -> 
     @sampleData = $injector.get 'sampleData' 
     email = @sampleData.email 
     # etc ... 

しかし、これは私にとってはちょっと怪しいようです。私の生産コードに、単体テストだけで必要なサンプルデータが含まれていることは望ましくありません。

角度/ジャスミン単位テストにどのように再利用可能なサンプルデータ値を入力すると便利でしょうか?

おかげ

+0

をインスタンス化する工場で、このグローバル変数を使用しています

var SETTINGS_RESPONSE = { fieldA: 42 }; 

、またはあなたは、次のとおりです。私のような内容のファイルsettings.data.jsを作成しましたあなたのユニットテストで使用するテスト値について話していますか? – Ben

+0

単体テストで使用するための単純で再利用可能なテスト値。私はその質問を明確にした。 – biofractal

+0

これは似たようなものですか? http://stackoverflow.com/questions/16563967/angularjs-karma-reuse-a-mock-service-when-unit-testing-directives-or-control karma.conf.jsファイルを編集して余分なファイルを追加したり、 –

答えて

9

これを行うための2つの方法があります。機能上の

  • スパイコールと偽の値を返します。
  • あなただけの偽のいくつかの呼び出しに持っていたときに最初のものは大丈夫です(それらを初期化するために、おそらくモックデータ)モッククラスを作成し、

を必要な場所にそれらをロードします。全体のクラスのためにそれをすることは持続不可能です。

たとえば、特別なURLを作成するサービスがあるとします。いずれかの方法がabsUrlに依存している場合、あなたは$locationオブジェクトのメソッドをスパイすることにより、それ偽物できます。

describe('example') function() { 
    beforeEach(inject(function() { 
     spyOn($location, 'absUrl').andCallFake(function (p) { 
      return 'http://localhost/app/index.html#/chickenurl'; 
     }); 
    })); 
it('should return the url http://www.chicken.org') ... { 
    // starting situation 
    // run the function 
    // asserts 
} 

は、今度はあなたが言語、テーマ、特殊なパスなどのデータをカプセル化Settingsサービスを持っているとしましょう、背景色、書体...は、サーバーへのリモート呼び出しを使用して初期化されます。 Settingsに依存するテストサービスは苦しいでしょう。毎回大きなコンポーネントをspyOnでモックする必要があります。あなたが10のサービスを持っていれば... spyOn関数をすべてコピーしたくないです。

ServiceASettingsサービス使用:

describe('ServiceA', function() { 
var settings, serviceA; 

beforeEach(module('myapp.mocks.settings')); // mock settings 
beforeEach(module('myapp.services.serviceA')); // load the service being tested 

beforeEach(inject(function (_serviceA_, _settings_) { 
    serviceA = _serviceA_; 
    settings = _settings_; 
})); 

容器 このテストスイートのために、Settingsサービスに対するすべての呼び出しは、実際のものと同じインタフェースを持つモックによって処理が、ダミーの値を返すであろう。 このサービスはどこにでもロードできます。 (何らかの理由で、あなたは本当の実装を使用するために必要な、あなたがモック前に、実際の実装をロードし、実際の実装への呼び出しを委任するために、特定のケースのためにspyOnを使用することができます。)

通常、 Mockモジュールをappフォルダの外に置きます。ユニットテスト、e2eテスト、libフォルダー、angular-mocks.jsファイルを持つtestフォルダーがあります。私もそこに私のモックを置きます。カルマあなたがテストのために必要なファイルを知らせる :

files: [ 
     'app/lib/jquery/jquery-1.9.1.js', 
     'test/lib/jasmine-jquery.js', 
     'app/lib/angular/angular.js', 
     'app/lib/angular/angular-*.js', 
     'test/lib/angular/angular-mocks.js', 
     'test/lib/myapp/*.js', /* this is mine */ 
     'app/js/**/*.js', 
     'test/unit/**/*.js' 
    ], 

ファイルtests/lib/myapp.mocks.settings.jsだけで、他のモジュールのようになります。

(function() { 
"use strict"; 

var m = angular.module('myapp.mocks.settings', []); 

m.service('settings', function() { ... }) 
}) 

第二の問題点(オプション):あなたはすぐにダミーの値を変更したいです。この例では、設定サービスは、初めてインスタンス化されたときにサーバーからオブジェクトをフェッチします。サービスにはすべてのフィールドのゲッターがあります。これはサーバーへのプロキシのようなものです。値を必要とするたびにリクエストを送信する代わりに、それらの一束をフェッチしてローカルに保存します。私のアプリケーションでは、実行時にサーバーの設定は変更されません。

のような何か:

1. fetch http://example.org/api/settings 
2. var localSettings = fetchedSettings; 
3 getFieldA: function() { return localSettings.fieldA; } 

移動し、グローバルな名前空間を汚染。モックサービスは、あなたがサービスをテストするためにモックオブジェクトを提供するという文脈で意味するかlocalSettings

関連する問題