Rspec рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдЧреЛ рдРрдк рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛

рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдкрд░реАрдХреНрд╖рдг рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ "рддреЛрдбрд╝рдиреЗ" рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдХрдИ рдЗрдВрдЯрд░рдХрдиреЗрдХреНрдЯреЗрдб рдШрдЯрдХреЛрдВ рд╕реЗ рдпреБрдХреНрдд рдЬрдЯрд┐рд▓ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ, рд╕рдмрд╕реЗ рдЖрдо рдЬрдореАрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рд╣рдордиреЗ рдЧреЛ рдкрд░ рдПрдХ рдШрдЯрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЕрдЪреНрдЫреЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдФрд░ рдХреИрд╕реЗ рд╣рдордиреЗ рд░реВрдмреА рдореЗрдВ рд░реВрдмреА рдореЗрдВ рдЖрд░рдПрд╕рдкреАрдИрдХреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рддрдХрдиреАрдХ рд╕реНрдЯреИрдХ рдкрд░ рдЬрд╛рдПрдВ


рдИрдЯреАрдИрдПрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬрд╣рд╛рдВ рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддрд╛, рд░рд┐рдкреЛрд░реНрдЯ рдЬрдирд░реЗрдЯрд░ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрд╡рд╛рдУрдВ рд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд░реЛрдз рдЬрд┐рдирдХреЗ рд╕рд╛рде рд╣рдо рдПрдХреАрдХреГрдд рд╣реИрдВред

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

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

рдЫрд╡рд┐

рд╕реЗрд╡рд╛ рдХреЛ рд░реЗрд▓ рд╕реЗ рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдФрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдм, рд░реЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдпрд╣ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдХреНрд╡реЗрд░реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рд╕реЗрд╡рд╛ рдиреЗ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛, Ngnix рдХреЗ рдмрд┐рдирд╛, рдереЛрдбрд╝реА рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдиреНрдпреВрдирддрд░ рдерд╛ред

рдЧреЛ рдореЗрдВ рд╣рдорд╛рд░реА рдпреВрдирд┐рдЯ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╕рдорд╕реНрдпрд╛


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

рд╕рдорд╛рдзрд╛рди рд╡рд┐рдзрд┐


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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпреЛрдЬрдирд╛ рдирд┐рдХрд▓реА рд╣реИ:

  1. rspec рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪрд▓рддреЗ-рдЪрд▓рддреЗ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЯреЗрд╕реНрдЯ рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдФрд░ HTTP рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреЛрд░реНрдЯ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 8082
  2. рдкреЛрд░реНрдЯ 8083 рдкрд░ рдЙрд╕ рдкрд░ рдкреНрд░рд╛рдкреНрдд HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рднреА рд▓реЙрдиреНрдЪ рдХреА рдЧрдИ рд╣реИ
  3. рд╣рдо RSpec рдкрд░ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдмрдирд╛рдПрдВ рдФрд░ рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ: 8082, рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП HTTParty рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  4. рдкрд╛рд░реНрд╕рд┐рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛; рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ; рд╣рдо "RequestBin" рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг:


рдЕрдм рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ, рдЖрдЗрдП рдкрд░реАрдХреНрд╖рдг рдХреА рдЧрдИ рд╕реЗрд╡рд╛ рдХрд╛ рдирд╛рдо рджреЗрдВ: "TheService" рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рдПрдВ:

#/spec/support/the_service.rb #ensure that after all specs TheService will be stopped RSpec.configure do |config| config.after :suite do TheServiceControl.stop end end class TheServiceControl class << self @pid = nil @config = nil def config puts "Please create file: #{config_path}" unless File.exist?(config_path) @config = YAML.load_file(config_path) end def host TheServiceControl.config['server']['addr'] end def config_path Rails.root.join('spec', 'support', 'the_service_config.yml') end def start # will be described below end def stop # will be described below end def post(params, headers) HTTParty.post("http://#{host}/request", body: params, headers: headers ) end end end 

рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реВрдБрдЧрд╛ рдХрд┐ Rspec рдореЗрдВ рдЗрд╕реЗ "рд╕рдорд░реНрдерди" рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдСрдЯреЛрд▓реЙрдб рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 Dir[Rails.root.join('spec/support/**/*.rb')].each {|f| require f} 

рдкреНрд░рд╛рд░рдВрдн рд╡рд┐рдзрд┐:

  • рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ TheService рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рдкрде рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝рддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕ рдХреЙрдиреНрдлрд┐рдЧ рдХреЛ Git рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЙрд╕реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпреЗ рд╡рд┐рд╖рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВ рддрд╛рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рди рд╣реЛред
  • рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ "go run {path to main.go} {path to config}" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ
  • рд╣рд░ рд╕реЗрдХрдВрдб рдорддрджрд╛рди, рдпрд╣ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЪрд▓ рд░рд╣реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ
  • рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреБрдирдГ рдЖрд░рдВрдн рди рд╣реЛ рдФрд░ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред

 #/spec/support/the_service.rb class TheServiceControl #.... def start return unless @pid.nil? puts "TheService starting. " env = config['rails']['env'] cmd = "go run #{config['rails']['main_go']} --config.file=#{config_path}" puts cmd #useful for debug when need run project manually #compile and run Dir.chdir(File.dirname(config['rails']['main_go'])) { @pid = Process.spawn(env, cmd, pgroup: true) } #wait until it ready to accept connections VCR.configure { |c| c.allow_http_connections_when_no_cassette = true } 1.upto(10) do response = HTTParty.get("http://#{host}/monitor") rescue nil break if response.try(:code) == 200 sleep(1) end VCR.configure { |c| c.allow_http_connections_when_no_cassette = false } puts "TheService started. PID: #{@pid}" end #.... end 

рд╕реНрд╡рдпрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:

 #/spec/support/the_service_config.yml server: addr: 127.0.0.1:8082 db: dsn: dbname=project_test sslmode=disable user=postgres password=secret redis: url: redis://127.0.0.1:6379/1 rails: main_go: /home/me/go/src/github.com/company/theservice/main.go recorder_addr: 127.0.0.1:8083 env: PATH: '/home/me/.gvm/gos/go1.10.3/bin' GOROOT: '/home/me/.gvm/gos/go1.10.3' GOPATH: '/home/me/go' 

рд╕реНрдЯреЙрдк рд╡рд┐рдзрд┐ рдмрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХрддреА рд╣реИред рдирдИ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдгрд┐рдХ "рдЧреЛ рд░рди" рдХрдорд╛рдВрдб рдЪрд▓рд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдмрд╛рдЗрдирд░реА рдЪрд▓рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдИрдбреА рдЕрдЬреНрдЮрд╛рдд рд╣реИред рдпрджрд┐ рдЖрдк рдорд╛рдгрд┐рдХ рд╕реЗ рд╢реБрд░реВ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ, рддреЛ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдкрдиреЗ рдЖрдк рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдкреЛрд░реНрдЯ рд╡реНрдпрд╕реНрдд рд░рд╣рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдореВрд╣ ID рджреНрд╡рд╛рд░рд╛ рд░реЛрдХ рд╣реЛрддреА рд╣реИ:

 #/spec/support/the_service.rb class TheServiceControl #.... def stop return if @pid.nil? print "Stopping TheService (PID: #{@pid}). " Process.kill("KILL", -Process.getpgid(@pid)) res = Process.wait @pid = nil puts "Stopped. #{res}" end #.... end 

рдЕрдм рд╣рдо рдПрдХ рд╕рд╛рдЭрд╛_рд╕рдВрдХреЗрдд рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдБ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рддреЛ TheService рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ VCR рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ (рдЙрдирдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╣рдо рдПрдХ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛ рд╕реЗ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ):

 #spec/support/shared_contexts/the_service_black_box.rb shared_context 'the_service_black_box' do let(:params) do { type: 'save', data: 1 } end let(:headers) { { 'HTTPS' => 'on', 'Content-Type' => 'application/json; charset=utf-8' } } subject(:response) { TheServiceControl.post(params, headers)} before(:all) { TheServiceControl.start } around(:each) do |example| VCR.configure { |c| c.allow_http_connections_when_no_cassette = true } example.run VCR.configure { |c| c.allow_http_connections_when_no_cassette = false } end end 

рдФрд░ рдЕрдм рдЖрдк рд╕реНрд╡рдпрдВ рдЪрд╢реНрдорд╛ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 #spec/requests/the_service/ping_spec.rb require 'spec_helper' describe 'ping request' do include_context 'the_service_black_box' it 'returns response back' do params[:type] = 'ping' params[:data] = '123' parsed_response = JSON.parse(response.body) # make request and parse response expect(parsed_response['error']).to be nil expect(parsed_response['result']).to eq '123' expect(Log.count).to eq 1 #check something in DB end # more specs... end 

TheService рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ HTTP рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рднреА рд╣реИ, рдпрд╣ "TheServiceControl" рд╡рд░реНрдЧ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрд╕ рд╕рдВрдХрд▓рди рдХреЗ рдмрд┐рдирд╛ рд╢реБрд░реВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдиреНрд╕


рдЧреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рд╕рднреА рд▓реЙрдЧ рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА STDOUT рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛред рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдкрд░, рдпрд╣ рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЬрдм Rspec рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдбреАрдмрдЧрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдРрдирдХ рдЪрдпрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП TheService рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдХрд▓реНрдкрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕реЗрд╡рд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рдЗрд╕реЗ рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ рдЖрдИрдбреАрдИ рдореЗрдВ рднреА рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдХрд▓реНрдкрдирд╛ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рдХрд░ рджреЗрдЧреА, рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдлреЗрдВрдХ рджреЗрдВрдЧреЗ, рдпрд╣ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдк рдЙрдкрджреНрд░рд╡ рдХреЗ рдмрд┐рдирд╛ рдбрд┐рдмреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ TDD рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


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

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


All Articles