7

次のコードがあります。

class Clients
  constructor : ->
    @clients = []

  createClient : (name)->

    client = new Client name
    @clients.push client

次のように Jasmine BDD でテストしています。

describe 'Test Constructor', ->

  it 'should create a client with the name foo', ->

    clients = new clients
    clients.createClient 'Foo'
    Client.should_have_been_called_with 'Foo'

  it 'should add Foo to clients', ->

    clients = new clients
    clients.createClient 'Foo'

    expect(clients.clients[0]).toEqual SomeStub

私の最初のテストでは、コンストラクターが正しい名前で呼び出されているかどうかを確認したいと思います。2 番目の例では、新しいクライアントから出力されたものが配列に追加されたことを確認したいだけです。

Jasmine BDD を使用しており、スパイ/モック/スタブを作成する方法がありますが、コンストラクターをテストすることはできないようです。そのため、コンストラクターをテストする方法を検討しています。追加のライブラリを必要としない方法があればいいのですが、私は何に対してもオープンです。

4

4 に答える 4

9

Jasmineでコンストラクターをスタブ化すること可能ですが、構文は少し予想外です。

spy = spyOn(window, 'Clients');

つまり、newメソッドをスタブアウトするのではなく、クラス名自体を、この場合はそれが存在するコンテキストでスタブアウトしますwindow。次に、をチェーンして、andReturn()選択した偽のオブジェクトを返すか、またはをチェーンしandCallThrough()て実際のコンストラクターを呼び出すことができます。

参照:Jasmineを使用したコンストラクターのスパイ

于 2012-07-08T23:44:17.247 に答える
4

Clientここでの最良の計画は、新しいオブジェクトの作成を別のメソッドに引き出すことだと思います。これにより、クラスを分離してテストし、ClientsモックClientオブジェクトを使用できます。

サンプル コードをいくつか作成しましたが、Jasmine でテストしていません。うまくいけば、それがどのように機能するかの要点を得ることができます:

class Clients
  constructor: (@clientFactory) ->
    @clients = []

  createClient : (name)->
    @clients.push @clientFactory.create name

clientFactory = (name) -> new Client name

describe 'Test Constructor', ->

  it 'should create a client with the name foo', ->
    mockClientFactory = (name) ->
    clients = new Clients mockClientFactory

    clients.createClient 'Foo'

    mockClientFactory.should_have_been_called_with 'Foo'

  it 'should add Foo to clients', ->
    someStub = {}
    mockClientFactory = (name) -> someStub
    clients = new Clients mockClientFactory

    clients.createClient 'Foo'

    expect(clients.clients[0]).toEqual someStub

基本的な計画は、別の関数 ( clientFactory) を使用して新しいClientオブジェクトを作成することです。このファクトリはテストでモック化され、返されるものを正確に制御し、正しく呼び出されたことを検査できます。

于 2011-09-29T09:22:34.647 に答える
0

最近のジャスミンバージョンを使用したより明確なソリューション:

window.Client = jasmine.createSpy 'Client'
clients.createClient 'Foo'
expect(window.Client).toHaveBeenCalledWith 'Foo'
于 2015-09-16T04:47:40.293 に答える