ASP.NET MVC рдкрд╛рда рдИред рдкрд░реАрдХреНрд╖рдг

рдкрд╛рда рдХрд╛ рдЙрджреНрджреЗрд╢реНрдпред рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдирд╛ рд╕реАрдЦреЗрдВред NUnitред рдЯреАрдбреАрдбреА рдХреЗ рдЖрд╡реЗрджрди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрддред рдирдХрд▓реАред рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгред рдПрдХреАрдХреГрдд рдкрд░реАрдХреНрд╖рдгред рдбреЗрдЯрд╛ рдЬрдирд░реЗрд╢рдиред

рдкрд░реАрдХреНрд╖рдг, TDD рд╕рд┐рджреНрдзрд╛рдВрдд, рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЕрдзрд┐рдХред

рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрдИ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред рдкрд░реАрдХреНрд╖рдг рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ? рд▓реЗрдХрд┐рди рдХреЛрдИ рдпрд╣ рддрд░реНрдХ рдирд╣реАрдВ рджреЗрдЧрд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рджреЛ рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
  1. рд╣рдо рдПрдХ рд╕рд╛рдЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЧреНрд░рд╛рд╣рдХ рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рд╡рд╣ рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдЪреНрдЫрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рднреЗрдЬрддрд╛ рд╣реИ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЦреБрд╢реА рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╕рд╛рдЗрдЯ рджреЗрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рд░рдЦреЗрдВред рдХреЛрдИ рднреА рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдЧреНрд░рд╛рд╣рдХ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЪрдорддреНрдХрд╛рд░ рдирд╣реАрдВ рд╣реБрдЖ рдФрд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ / рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред рд╕рд╛рдЗрдЯ рдорд░ рд░рд╣реА рд╣реИред рдХреНрдпрд╛ рдореБрдЭреЗ рд╡рд╣рд╛рдВ рдкрд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
  2. рд╣рдо рдПрдХ рд╕рд╛рдЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЧреНрд░рд╛рд╣рдХ рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рд╡рд╣ рд╕рдВрдкрд╛рджрди рдХреА рдПрдХ рд╕реВрдЪреА рднреЗрдЬрддреЗ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдЗрдЯ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВред рдЫрд╣ рдорд╣реАрдиреЗ рдмрд╛рдж, рд╕рд╛рдЗрдЯ рдореЗрдВ рдкреНрд░рддрд┐ рджрд┐рди 300 рдЕрджреНрд╡рд┐рддреАрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЖрдВрдХрдбрд╝рд╛ рджрд┐рди-рдкреНрд░рддрд┐рджрд┐рди рдмрдврд╝ рд░рд╣рд╛ рд╣реИред рдЧреНрд░рд╛рд╣рдХ рд▓рдЧрд╛рддрд╛рд░ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реИ, рдкреБрд░рд╛рдирд╛ рдХреЛрдб рдмрдврд╝рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рд╕рдордп рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред




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


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


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реБрдзрд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

рд╣рдордиреЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рдПрдХ рдЯреИрдЧ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдмреНрд▓реЙрдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрджрд╛ рдХреЛрдб рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЛрдВрдиреЗ рдордЪрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЬрд╛рдБрдЪ рдХреА - рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ - рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рд╡реЗ UpdatePost (cache.Tags = example.Tags;) рдореЗрдВ рдлрд╝реАрд▓реНрдб рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛрдбрд╝рдирд╛ рднреВрд▓ рдЧрдПред рдкреБрд░рд╛рдиреЗ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рд╣рдо рдРрд╕реЗ рдЯреИрдЧ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдЯреЗрд╕реНрдЯ рдореЗрдВ рдзрдорд╛рдХреЗ рдХреЗ рд╕рд╛рде рдкрд╛рд╕ рд╣реБрдЖред рдЬреАрд╡рди рдПрдХ рдкреАрдбрд╝рд╛ рд╣реИ!

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

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


рдпреЗ рдореБрдЦреНрдп рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрдВрдЬреАрдХрд░рдг рдХреИрд╕реЗ рд╣реИ:


рдЖрдЗрдП рдЗрд╕ рд╕рдм рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдмрдирд╛рдПрдВ:

рдЪрд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░рддреЗ рд╣реИрдВред

NUnit рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

рд▓рд┐рдВрдХ http://sourceforge.net/projects/nunit/ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдФрд░ NUnit рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред рд╣рдо рд╡реАрдПрд╕ рдореЗрдВ NUnit рдЯреЗрд╕реНрдЯ рдПрдбрд╛рдкреНрдЯрд░ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдареАрдХ рд╣реИ, рд╡реАрдПрд╕ рдореЗрдВ рд╕реАрдзреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП)ред


рд╕реЙрд▓реНрдпреВрд╢рди рдлреЛрд▓реНрдбрд░ рдЯреЗрд╕реНрдЯ рдХрд╛ рдПрдХ рдлреЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ LessonProject.UnitTest рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ NUIT рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ:
Install-Package NUnit 


(/Test/Default/UserContoller.cs) рдореЗрдВ UserControllerTest рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ:
  [TestFixture] public class UserControllerTest { } 


рддреЛ, рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдирд╛рдо рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд Method_Scenario_ExpectedBehavior:


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реА рдЪреАрдЬ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреГрд╢реНрдп рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рджреЗрдЦрддреЗ рд╣реИрдВ:
  public void Register_GetView_ItsOkViewModelIsUserView() { Console.WriteLine("=====INIT======"); var controller = new UserController(); Console.WriteLine("======ACT======"); var result = controller.Register(); Console.WriteLine("====ASSERT====="); Assert.IsInstanceOf<ViewResult>(result); Assert.IsInstanceOf<UserView>(((ViewResult)result).Model); } 


рддреЛ, рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ 3 рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ-> рдЕрдзрд┐рдирд┐рдпрдо-> рдЬреЛрд░:


рдкрд░реАрдХреНрд╖рдг рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдЯреИрдм рдЦреЛрд▓реЗрдВ:


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


рдПрдХ рд╡рд░реНрдЧ UnitTestSetupFixture.cs (/Setup/UnitTestSetupFixture.cs) рдмрдирд╛рдПрдВ:
  [SetUpFixture] public class UnitTestSetupFixture { [SetUp] public void Setup() { Console.WriteLine("==============="); Console.WriteLine("=====START====="); Console.WriteLine("==============="); } [TearDown] public void TearDown() { Console.WriteLine("==============="); Console.WriteLine("=====BYE!======"); Console.WriteLine("==============="); } } 


рдЪрд▓рд╛рдПрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
===============
=====START=====
===============
=====INIT======
======ACT======
====ASSERT=====

===============
=====BYE!======
===============


рджрд┐рдЦрд╛рд╡рдЯреА

рддреЛ, рдореЙрдХ рдПрдХ рдкреИрд░реЛрдбреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдпрд╛рдиреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рдорд╛рди рдХреБрдЫред рдорд┐рд░рд╛рдЬ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ред рдПрдХ рд╕реНрдЯрдм рднреА рд╣реИ - рдпрд╣ рдПрдХ рд╕реНрдЯрдм рд╣реИред рдЙрджрд╛рд╣рд░рдг рдареВрдВрда рд╡рд┐рдзрд┐:
 public int GetRandom() { return 4; } 


рд▓реЗрдХрд┐рди рд╣рдо рдореЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
 Install-Package Moq 


рдЖрдЗрдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВред рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ рд╣рдо рдПрдХ рдмрд╛рд░ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рд▓рд╛рдП рдереЗ:


рдФрд░ рдлрд┐рд░ рдореИрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЯрд┐рдкреНрдкрдгреА рдХрд░реВрдВрдЧрд╛ред рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдорд┐рд░рдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред рдпреЛрдЬрдирд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпреЛрдЬрдирд╛ рдореЗрдВ - рдпрд╣ рдПрдХ рдмреБрд░рд╛ рдЙрдкрдХреНрд░рдо рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдкрддреНрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ string.Format () рдПрдХ FormatException рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХреЗред рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдареАрдХ рдЧреБрдЬрд░рддрд╛ рд╣реИред рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╡рд╣ рдХреНрдпрд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ? рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдореВрд▓ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдмрд╛рдж рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред

IMapper рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ CommonMapper рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдЖрдЗрдХреЙрд░реНрди рдХреЛ рдЯреЗрд╕реНрдЯ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред App_Start / NinjectWebCommon.cs рдореЗрдВ, рд╣рдо RegisterServices рд╡рд┐рдзрд┐ рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕реЗ bootstrapper рдореЗрдВ рдХреЙрд▓ рдХрд░реЗрдВред Initialize (CreateKernel)ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо DependencyResolver.GetService () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕реЗрд╡рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред рддреЛ NinjectD dependencyResolver (/Tools/NinjectD dependencyResolver.cs) рдмрдирд╛рдПрдВ:
 public class NinjectDependencyResolver : IDependencyResolver { private readonly IKernel _kernel; public NinjectDependencyResolver(IKernel kernel) { _kernel = kernel; } public object GetService(Type serviceType) { return _kernel.TryGet(serviceType); } public IEnumerable<object> GetServices(Type serviceType) { try { return _kernel.GetAll(serviceType); } catch (Exception) { return new List<object>(); } } } 


SetUp (/Setup/UnitTestSetupFixture.cs) рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
 [SetUp] public virtual void Setup() { InitKernel(); } protected virtual IKernel InitKernel() { var kernel = new StandardKernel(); DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); InitRepository(kernel); //  return kernel; } 


рдПрдХ MockRepository рдмрдирд╛рдПрдБ
(/Mock/Repository/MockRepository.cs):
 public partial class MockRepository : Mock<IRepository> { public MockRepository(MockBehavior mockBehavior = MockBehavior.Strict) : base(mockBehavior) { GenerateRoles(); GenerateLanguages(); GenerateUsers(); } } 

(/Mock/Repository/Entity/Language.cs)
 namespace LessonProject.UnitTest.Mock { public partial class MockRepository { public List<Language> Languages { get; set; } public void GenerateLanguages() { Languages = new List<Language>(); Languages.Add(new Language() { ID = 1, Code = "en", Name = "English" }); Languages.Add(new Language() { ID = 2, Code = "ru", Name = "" }); this.Setup(p => p.Languages).Returns(Languages.AsQueryable()); } } } 


(/Mock/Repository/Entity/Role.cs)
  public partial class MockRepository { public List<Role> Roles { get; set; } public void GenerateRoles() { Roles = new List<Role>(); Roles.Add(new Role() { ID = 1, Code = "admin", Name = "Administrator" }); this.Setup(p => p.Roles).Returns(Roles.AsQueryable()); } } 


(/Mock/Repository/Entity/User.cs)

 public partial class MockRepository { public List<User> Users { get; set; } public void GenerateUsers() { Users = new List<User>(); var admin = new User() { ID = 1, ActivatedDate = DateTime.Now, ActivatedLink = "", Email = "admin", FirstName = "", LastName = "", Password = "password", LastVisitDate = DateTime.Now, }; var role = Roles.First(p => p.Code == "admin"); var userRole = new UserRole() { User = admin, UserID = admin.ID, Role = role, RoleID = role.ID }; admin.UserRoles = new EntitySet<UserRole>() { userRole }; Users.Add(admin); Users.Add(new User() { ID = 2, ActivatedDate = DateTime.Now, ActivatedLink = "", Email = "chernikov@gmail.com", FirstName = "Andrey", LastName = "Chernikov", Password = "password2", LastVisitDate = DateTime.Now }); this.Setup(p => p.Users).Returns(Users.AsQueryable()); this.Setup(p => p.GetUser(It.IsAny<string>())).Returns((string email) => Users.FirstOrDefault(p => string.Compare(p.Email, email, 0) == 0)); this.Setup(p => p.Login(It.IsAny<string>(), It.IsAny<string>())).Returns((string email, string password) => Users.FirstOrDefault(p => string.Compare(p.Email, email, 0) == 0)); } } 


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдореЙрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдкрд╛рд╕ рд╕реЗрдЯрдЕрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЗрддрдиреА рдЕрдЪреНрдЫреА рд╡рд┐рдзрд┐ рд╣реИ (рдлрд┐рд░ рд╕реЗ? рдареЛрд╕ рд╕реЗрдЯрдЕрдк!), рдЬреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
this.Setup( ).Returns( );

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
this.Setup(p => p.WillYou()).Returns(true);

рдЖрдЗрдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

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


All Articles