2011-09-25 10 views
7

मैं निम्नलिखित कोड है: यदि निर्माता किया जा रहा हैनकली/स्टब निर्माता

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 

मेरा पहला परीक्षण में मैं जाँच करना चाहते हैं:

class Clients 
    constructor : -> 
    @clients = [] 

    createClient : (name)-> 

    client = new Client name 
    @clients.push client 

मैं इस तरह जैस्मीन BDD के साथ परीक्षण कर रहा हूँ सही नाम के साथ बुलाया। मेरे दूसरे में मैं सिर्फ यह पुष्टि करना चाहता हूं कि नए क्लाइंट से जो कुछ भी आया वह सरणी में जोड़ा गया था।

मैं जैस्मीन बीडीडी का उपयोग कर रहा हूं और इसमें जासूस/मैक्स/स्टब्स बनाने का एक तरीका है, लेकिन ऐसा लगता है कि कन्स्ट्रक्टर का परीक्षण करना संभव नहीं है। तो मैं कन्स्ट्रक्टर का परीक्षण करने के लिए एक रास्ता तलाश रहा हूं, अगर कोई तरीका है कि मुझे अतिरिक्त लाइब्रेरी की आवश्यकता नहीं है तो मैं अच्छा होगा लेकिन मैं कुछ भी खोल रहा हूं।

उत्तर

4

मुझे लगता है कि यहां नई योजना Client ऑब्जेक्ट को एक अलग विधि के निर्माण को खींचने के लिए है। यह आपको अलगाव में Clients कक्षा का परीक्षण करने और मॉक Client ऑब्जेक्ट्स का उपयोग करने की अनुमति देगा।

मैंने कुछ उदाहरण कोड चुरा लिया है, लेकिन मैंने जैस्मीन के साथ इसका परीक्षण नहीं किया है।

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 

मूल योजना अब नए Client वस्तुओं को बनाने के लिए एक अलग समारोह (clientFactory) का उपयोग करने के लिए है: उम्मीद है कि आप यह कैसे काम करता का सार मिल सकता है। इस कारखाने को तब परीक्षणों में मजाक कर दिया जाता है जो आपको वापस लौटने के लिए अनुमति देता है, और निरीक्षण करता है कि इसे सही तरीके से बुलाया गया है।

spy = spyOn(window, 'Clients'); 

दूसरे शब्दों में, आप new विधि बाहर ठूंठ नहीं है, आप बाहर वर्ग ठूंठ:

+0

मुझे डर था कि मुझे इसे इस तरह हल करना होगा। फिर भी महान जवाब धन्यवाद। – Pickels

9

यह जैस्मीन में कंस्ट्रक्टर्स बाहर ठूंठ संभव है, वाक्य रचना बस थोड़ा अप्रत्याशित है उस संदर्भ में नाम जहां यह रहता है, इस मामले में window। इसके बाद आप वास्तविक चयनकर्ता को कॉल करने के लिए अपने चयन की फर्जी ऑब्जेक्ट, या andCallThrough() वापस करने के लिए andReturn() पर श्रृंखला बना सकते हैं।

यह भी देखें: Spying on a constructor using Jasmine

+1

यह वास्तव में काम नहीं करता है अगर ग्राहक बंद होने पर एक चर है। – Zequez

0

मेरे समाधान

मैं अपने ऐप करवाते हैं (नहीं वास्तव में बड़ी एप्लिकेशन) एक मॉड्यूल का उपयोग कर, और वहाँ से मजाक समाप्त हो गया @zpatokal अप करने के लिए इसी तरह के समाप्त हो गया। एक पकड़ यह है कि and.callThrough काम नहीं करेगा, क्योंकि निर्माता को जैस्मीन विधि से बुलाया जा रहा है, इसलिए मुझे and.callFake के साथ कुछ चालबाजी करना पड़ा।

पर unit.coffee

class PS.Unit 

units.coffee

class PS.Units 
    constructor: -> 
    new PS.Unit 

पर और कल्पना फाइलों पर:

Unit = PS.Unit 

describe 'Units', -> 
    it 'should create a Unit', -> 
    spyOn(PS, 'Unit').and.callFake -> new Unit arguments... # and.callThrough() 
    expect(PS.Unit).toHaveBeenCalled() 
0
हाल चमेली संस्करण के साथ

स्पष्ट समाधान:

window.Client = jasmine.createSpy 'Client' 
clients.createClient 'Foo' 
expect(window.Client).toHaveBeenCalledWith 'Foo'