рдЪрдореЗрд▓реА DRY: рдХреНрдпрд╛ рдЖрдк рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ?

рдмреИрдХ-рдПрдВрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реЗ рдлреНрд░рдВрдЯ-рдПрдВрдб рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рдмреАрдЪ рдХреА рдЕрд╡рдзрд┐ рдореЗрдВ, рдореБрдЭреЗ RoR рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдерд╛ (рд╣рд╛рдВ, рдкрд░реАрдХреНрд╖рдг рдереЗ)ред рдореЗрд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдгрд┐рдХрд╡рд╛рджрд┐рдпреЛрдВ рдХреЗ рд╕рдореБрджрд╛рдп рдХрд╛ рдЕрдЬреАрдм рдорд╛рд╣реМрд▓ рдерд╛, рдЬреЛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдЦреНрдд рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдЦрд░рд╛рдм рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдорд╛рдл рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рдХреЛрдб рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдФрд░ рдкрдардиреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред

рдПрдХ рд╣реА рдирд┐рдпрдо рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓ рдкрд░рд┐рдорд╛рдг рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЙрдирдХрд╛ рд╕реБрдирд╣рд░рд╛ рдирд┐рдпрдо рд╣реИ - рдкреНрд░рддрд┐ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдЙрдореНрдореАрдж ред рдЙрдореНрдореАрдж рдХреА рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрдИ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ / рдПрдХ рд╣реА рдкрд░реАрдХреНрд╖рд╛ рдореЗрдВ рдмреБрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП / рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП , рдмрд╕ рдХрд░рдирд╛ рдмрдВрдж рдХрд░реЛ! рдФрд░ рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рднреА рдХреЛрдб рд╣реИрдВ, рдФрд░ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред

рдПрдХ рдмреБрд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХреНрдпрд╛ рд╣реИ?


рдиреЙрдХрдЖрдЙрдЯ.рдЬреЗрдПрд╕ рдХреЗ 3.0 рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдордЭрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдмрд╛рдЗрдВрдбрд░реЛрдВ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдмрд╛рдж рдХрдо рд╕реЗ рдХрдо рдирдП рдХрд╛ рдХреБрдЫ рдЙрд▓реНрд▓реЗрдЦ рдЦреЛрдЬрдиреЗ рдХреА рдЙрдореНрдореАрдж рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореИрдВ рд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╕реЗ рдирд╛рд░рд╛рдЬ рдерд╛ред

рдЦрд░рд╛рдм рдкрд░реАрдХреНрд╖рдг
describe('Binding: Checked', function() { beforeEach(jasmine.prepareTestNode); it('Triggering a click should toggle a checkbox\'s checked state before the event handler fires', function() { testNode.innerHTML = "<input type='checkbox' />"; var clickHandlerFireCount = 0, expectedCheckedStateInHandler; ko.utils.registerEventHandler(testNode.childNodes[0], "click", function() { clickHandlerFireCount++; expect(testNode.childNodes[0].checked).toEqual(expectedCheckedStateInHandler); }) expect(testNode.childNodes[0].checked).toEqual(false); expectedCheckedStateInHandler = true; ko.utils.triggerEvent(testNode.childNodes[0], "click"); expect(testNode.childNodes[0].checked).toEqual(true); expect(clickHandlerFireCount).toEqual(1); expectedCheckedStateInHandler = false; ko.utils.triggerEvent(testNode.childNodes[0], "click"); expect(testNode.childNodes[0].checked).toEqual(false); expect(clickHandlerFireCount).toEqual(2); }); }); 


рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдирд┐рд░реНрджреЗрд╢ ( рд╡рд░реНрдгрди рдФрд░ рдпрд╣ ) рдХрд▓реНрдкрдирд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рддреЛ рд╣реЗрдбрд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрд░реНрде рдХреЛ рд╕рдордЭрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ ( рдпрд╣ рдПрдХ рдХреНрд▓рд┐рдХ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ... )ред рдпрд╣ рд╢реАрд░реНрд╖рдХ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рджреЛрдиреЛрдВ рд╣реА рдмрдХрд╡рд╛рд╕ рд╣реИред

рдпрд╣рд╛рдБ рдЙрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд╕рд░рд▓ рдЪрд╢реНрдорд╛ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ:
  1. рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреНрдпрд╛ рд╣реИрдВ?
  2. рдкрд░реАрдХреНрд╖рдг рд╕рдВрджрд░реНрдн рдХреНрдпрд╛ рд╣реИ?
  3. рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
  4. рдореИрдВ рдЗрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
  1. рдЪреЗрдХрдмреЙрдХреНрд╕ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб
  2. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪреЗрдХрдмреЙрдХреНрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ
  3. рдорд╛рдорд▓реЛрдВ:
    1. рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдХрд╣реЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред
    2. рдпрджрд┐ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЧрдИ рдереА, рддреЛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдЖ рд╣реИ
    3. рдпрджрд┐ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рддреЛ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ


рдЕрдм рд╕рдм рдХреБрдЫ рдХреЗрд╡рд▓ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╣реА рд╣реИ:

рдмрд╕ рдкрдардиреАрдп рдкрд░реАрдХреНрд╖рдг
 describe('Binding: Checked', function() { beforeEach(jasmine.prepareTestNode); describe("when user clicks on checkbox", function () { beforeEach(function () { testNode.innerHTML = "<input type='checkbox' />"; this.checkbox = testNode.childNodes[0]; this.stateHandler = jasmine.createSpy("checked handler"); this.checkbox.checked = false; ko.utils.registerEventHandler(this.checkbox, "click", function() { this.stateHandler(this.checkbox.checked); }.bind(this)); ko.utils.triggerEvent(this.checkbox, "click"); }) it ("changes state before event handler is triggered", function () { expect(this.stateHandler).toHaveBeenCalledWith(true); }) it ("marks checkbox if it's not marked", function () { expect(this.checkbox.checked).toBe(true) }) it ("unmarks checkbox if it's marked", function () { this.checkbox.checked = true; ko.utils.triggerEvent(this.checkbox, "click"); expect(this.checkbox.checked).toBe(false); }) }) }) 


рд╕реЗрдЯрдЕрдк рдЬрдЯрд┐рд▓ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рд╕рд░рд▓ рд╣реИрдВред рдЖрджрд░реНрд╢ рд╡рд┐рдХрд▓реНрдк рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╣реИред

рдХрдо рдХреЛрдб, рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг


рдЬрдм рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ рдЬреИрд╕реНрдореАрди рд╕реЗ рдорд┐рд▓рд╛ , рддреЛ рдореБрдЭреЗ рдорд╣рд╕реВрд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдореВрд╣ рдЪрд╢реНрдорд╛ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рдкрд╛рдХрд░, рдореИрдВ рдШрдмрд░рд╛рд╣рдЯ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП Google рдкрд░ рдкрд╣реБрдВрдЪрд╛ред рдореЗрд░реА рдмрдбрд╝реА рдирд┐рд░рд╛рд╢рд╛ рдХреЗ рд▓рд┐рдП, рд╡рд╣ рднреА рдЬрд╡рд╛рдм рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдерд╛ рдЬреЛ рдореБрдЭреЗ рд╕реВрдЯ рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рдЦреБрдж рдЬреИрд╕реНрдореАрди рдХреА рдЕрдВрдзреЗрд░реА рдЖрдВрддреЛрдВ рдореЗрдВ рдмрд╣рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдЗрд╕рдХрд╛ рд╣рд▓ рдвреВрдВрдврдирд╛ рдкрдбрд╝рд╛ред

рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ ++ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ( рдЖрдХрд╛рд░ рдФрд░ рд╕рдорд╛рд╣рд┐рдд ) рдХреЗ рд╕рд╛рде 2 рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ рд╕рд░рдгреА рдФрд░ рд╕реЗрдЯ ред рдЕрдм рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ! рд╣рдорд╛рд░реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
 sharedExamplesFor("collection", function () { beforeEach(function () { this.sourceItems = [1,2,3]; this.collection = new this.describedClass(this.sourceItems); }) it ("returns proper size", function () { expect(this.collection.size()).toBe(this.sourceItems.length); }) // another specs it ("returns true if contains item", function () { expect(this.collection.contains(this.sourceItems[0])).toBe(true); }) }) 

Rspec рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдореИрдВ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЪрд╢реНрдорд╛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

рдиреЛрдЯ : itShouldBehaveLike рдФрд░ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВExamplesFor - рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИрдВ

 // array_spec.js describe("Array", function () { beforeEach(function () { this.describedClass = Array; }) itBehavesLike("collection"); //another specs }) // set_spec.js describe("Set", function () { beforeEach(function () { this.describedClass = Set; }) itBehavesLike("collection"); //another specs }); 

рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдХрд▓реНрдкрдирд╛ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рд╕рдорд╛рд░реЛрд╣ ( рд╡рд░реНрдгрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо) рднреА рдмрдирд╛рддрд╛ рд╣реВрдВред

рд╕рд╛рдЭрд╛ рдХрд▓реНрдкрдирд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб
  // spec_helper.js var sharedExamples = {}; window.sharedExamplesFor = function (name, executor) { sharedExamples[name] = executor; }; window.itBehavesLike = function (sharedExampleName) { jasmine.getEnv().describe("behaves like " + sharedExampleName, sharedExamples[sharedExampleName]); }; window.includeExamplesFor = function (sharedExampleName) { var suite = jasmine.getEnv().currentSuite; sharedExamples[sharedExampleName].call(suite); }; window.context = window.describe; window.includeExamples = window.includeExamplesFor; window.itShouldBehaveLike = window.itBehavesLike; 

Source: https://habr.com/ru/post/In207794/


All Articles