
рдпрд╣ рд▓реЗрдЦ
рдЬреИрд╕реНрдореАрди рдХреЗ рдкрд░рд┐рдЪрдп рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ
рдЬреИрд╕реНрдореАрди рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХреА рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рджреА рдЧрдИ рд╣реИрдВ:
- рдЬрд╛рд╕реВрд╕ - рдХрд╛рд░реНрдпреЛрдВ / рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг
- рдШрдбрд╝реА - рд╕реЗрдЯ рдЯрд╛рдЗрдордЖрдЙрдЯ / рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреЙрд▓ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди
- рдзрд╛рд╡рдХ рдФрд░ рд░рд┐рдкреЛрд░реНрдЯрд░ - рдкрд░реАрдХреНрд╖рдг рдФрд░ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдЪрд▓рд╛рдирд╛
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ (
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрджрд╛рд╣рд░рдг ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рдП рдЧрдП рд╣реИрдВред
рдЬреИрд╕реНрдореАрди рдореЗрдВ, рдЯреНрд░реИрдХрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдФрд░ рдХреЙрд▓ рдкреИрд░рд╛рдореАрдЯрд░
рдЬрд╛рд╕реВрд╕реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдкрд╛рдИрдСрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ - рд╡рд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореЙрдирд┐рдЯрд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо:
spyOn(window, 'isNaN')
рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдореЗрдВ, SpyOn рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЫреЛрдЯреЗ рд╡реНрдпрдХреНрддрд┐ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ:
class Person name: null age: 0 constructor: (@name, @age) -> getName: -> @name setName: (value) -> @name = value getAge: -> @age addYear: -> @age += 1
рдЬрд╛рд╕реВрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдкрд░реАрдХреНрд╖рдг
, рдЖрдк рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЙрдирдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
describe "Spy", -> person = null beforeEach -> person = new Person("Jim", 25) it " ", -> spyOn(person, 'getName') person.getName() expect(person.getName).toHaveBeenCalled() it " ", -> spyOn(person, 'addYear') person.addYear() person.addYear() expect(person.addYear.calls.length).toEqual(2) it " ", -> spyOn(person, 'setName') person.setName("Ira") expect(person.setName).toHaveBeenCalledWith("Ira")
рдЬрдм SpyC рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рд╛рде рдХрд┐рдпрд╛
рдЬрд╛рддрд╛ рд╣реИ , рддреЛ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛:
it " ", -> spyOn(person, 'getName').andCallThrough() expect(person.getName()).toEqual("Jim") expect(person.getName).toHaveBeenCalled()
рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рди рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЬрд╛рд╕реВрд╕ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
it " ", -> spyOn(person, 'getName').andReturn("Dan") expect(person.getName()).toEqual("Dan") expect(person.getName).toHaveBeenCalled()
рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп andCallFake рдХреЗ рд╕рд╛рде
spyOn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
it " ", -> spyOn(person, 'getAge').andCallFake(-> return 5 * 11) expect(person.getAge()).toEqual(55) expect(person.getAge).toHaveBeenCalled()
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк
createSpy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдирд┐рдпрдорд┐рдд рдЬрд╛рд╕реВрд╕ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ createSpy рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд╣реИред
it " ", -> concat = jasmine.createSpy('CONCAT') concat("one", "two") expect(concat.identity).toEqual('CONCAT')
рд╕реНрдЯрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛
createSpyObj рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред CreateSpyObj рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╛рдо рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯрдм рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ:
it " ", -> button = jasmine.createSpyObj('BUTTON', ['click', 'setTitle', 'getTitle']) button.click() button.setTitle("Help") expect(button.click).toBeDefined() expect(button.click).toHaveBeenCalled() expect(button.setTitle).toHaveBeenCalledWith("Help") expect(button.getTitle).not.toHaveBeenCalled()
рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдБрдЪ рдХрд░
рдЪрдореЗрд▓реА рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░
рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ :
it " ", -> spyOn(person, 'setName') person.setName("Ira") expect(person.setName).toHaveBeenCalledWith(jasmine.any(String))
рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ / рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ рдХреЙрд▓реНрд╕ рдХрд╛ рд╕рдордХрд╛рд▓рд┐рдХ рдкрд░реАрдХреНрд╖рдг
рдЪрдореЗрд▓реА рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Clock.useMock ред рд╕рдордп рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП,
jasmine.Clock.tick рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдордп
рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ :
describe "", -> callback = null beforeEach -> callback = jasmine.createSpy('TIMER') jasmine.Clock.useMock() it " timeout ", -> setTimeout((-> callback()), 100)
рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЬреИрд╕реНрдореАрди рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдЬреИрд╕реНрдореАрди рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдореБрдЦреНрдп рд╣реИрдВ:
- HtmlReporter - рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдкреЗрдбрд╝ рдХреА рд╕рдВрд░рдЪрдирд╛
- рддреБрдЪреНрдЫ рд╡реГрдХреНрд╖ - рд╕рд╛рдзрд╛рд░рдг рд╡реГрдХреНрд╖ рд╕рдВрд░рдЪрдирд╛ (рдЕрдкреНрд░рдЪрд▓рд┐рдд рдЪрд┐рд╣реНрдирд┐рдд)
- рдХрдВрд╕реЛрд▓ рдХрдВрд╕реЛрд▓ - рдЖрдЙрдЯрдкреБрдЯ рдЯреЗрд╕реНрдЯ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо (рдиреЛрдб рдХреЗ рд▓рд┐рдП)
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдкреНрд░рд╢реНрди рдпрд╛ рдЯрд┐рдкреНрдкрдгреА рд╣реИ, рддреЛ рдореБрдЭреЗ рдЙрдирдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
рд╕рдВрджрд░реНрдн:
github.com/pivotal/jasmine - GitHub рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЗрдЬ
www.inexfinance.com/hi/blog/2013/2/17/jasmine_additional_features - рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг
github.com/inex-finance/blog-examples/tree/master/jasmine - рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг