Autofixture: SemanticComparison - ๋‘ ์ž์‹ ์ปฌ๋ ‰์…˜์˜ ์œ ์‚ฌ์„ฑ

์— ๋งŒ๋“  2017๋…„ 06์›” 21์ผ  ยท  13์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: AutoFixture/AutoFixture

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ „์— ์งˆ๋ฌธ์„ ๋ฐ›์•˜์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜๊ณ  ์ด๊ฒƒ์„ ๊ตฌ๊ธ€๋งํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ๋ณต์žกํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์ง€๋งŒ ์–ด์จŒ๋“  ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๊ฐ™์€ ์œ ํ˜•์˜ ๋ณต์žกํ•œ ๊ฐœ์ฒด๊ฐ€ ๋‘ ๊ฐœ ์žˆ๋Š”๋ฐ ๋น„๊ตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—๋Š” ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ํ•ญ๋ชฉ ๋ชจ์Œ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ์ˆœ์„œ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. SemanticComparison์œผ๋กœ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ํ˜„์žฌ json ๋น„๊ต ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋น„๊ต๊ฐ€ ์‹คํŒจํ•  ๋•Œ ์ด๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์€ ์•…๋ชฝ์ž…๋‹ˆ๋‹ค. Likeness๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.์ƒ์ž์—์„œ ๋‚˜์˜จ ํด๋ž˜์Šค๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์ปฌ๋ ‰์…˜์— ๋™์ผํ•œ ํ•ญ๋ชฉ์ด ๋“ค์–ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ปฌ๋ ‰์…˜์—์„œ ์—‰๋ง์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ฒฝ์šฐ https://github.com/jmansar/SemanticComparisonExtensions ๋ฅผ ํฐ ํšจ๊ณผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ ๋‚˜๋Š” ๋‚ด๋ฉด์˜ ๋ชจ์Šต์„ ์ œ์–ดํ•˜๊ณ  ์•ฝ๊ฐ„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ์ค‘์ฒฉ ๋น„๊ต๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ํ›Œ๋ฅญํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  13 ๋Œ“๊ธ€

๋น„๊ตํ•˜๋ ค๋Š” ๋ฌผ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ์ด ์˜ˆ์—์„œ์™€ ๊ฐ™์ด SemanticComparer<T> ์ง์ ‘ ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ Likeness<TSource, TDestination> ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public class SongDto
    {
        public string Lyrics { get; set; }
        public IEnumerable<TagDto> Tags { get; set; }
        public string FileName { get; set; }
        public string CustomPromoLink { get; set; }
        public string UPC { get; set; }
        public YoutubeVideoDto YouTubeVideo { get; set; }
    }

๋”ธ๊พน์งˆ์„ ํ•œ ๋‘ ๊ฐ€์ง€ ์†์„ฑ์€ TagDto ์ปฌ๋ ‰์…˜๊ณผ YouTubeVideoDto์˜€์œผ๋ฉฐ ์ด์ƒ์ ์œผ๋กœ๋Š” ์ด๋Ÿฌํ•œ ์†์„ฑ์„ ํƒ์ƒ‰ํ•˜๊ณ  ์ตœ๋Œ€ํ•œ ๊นŠ์ด ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด ๋น„๊ต ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ์–ด์จŒ๋“  ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ JSON ๋น„๊ต๊ธฐ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌดํ•œ ์‹œํ€€์Šค์ธ ๊ฒฝ์šฐ ํ•ด๋‹น JSON ๋น„๊ต๊ธฐ๊ฐ€ IEnumerable<TagDto> ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ฌดํ•œ ์‹œํ€€์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์ด ์™„๋ฒฝํ•˜๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ๋ถ„๋ช…ํžˆ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ์œผ๋ฏ€๋กœ SemanticComparison์— ๋›ฐ์–ด๋“ค์ง€๋งŒ SC๊ฐ€ ์ด ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋‹จ์ˆœํžˆ ์‚ฌ์šฉ์˜ ์š”์ ์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋‚˜๋Š” ole interwebs์—์„œ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์œ ์‚ฌ ํ•  ์ˆ˜์žˆ๋Š” ์ด ์‚ฌ์šฉํ•˜๋Š” DelegatingMemberComparer ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ ํ•ญ์ƒ True ์— ๋Œ€ํ•ด IEnumerable<TagDto> ๋” ๋‚˜์€ ๋‚˜, ๋น„๊ต IEnumerable<TagDto> ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ .

(์œ„ ๋งํฌ์˜ ๋‘ ๋ฒˆ์งธ ๋ฐ ์„ธ ๋ฒˆ์งธ DelegatingMemberComparer ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.)

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์…”์„œ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณธ์งˆ์ ์œผ๋กœ ์—ฌ์ „ํžˆ ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ DelegatingMemberComparer๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์ ์€ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ์—์„œ ์–ด๋–ค ์†์„ฑ์ด ๋‹ค๋ฅธ์ง€ ์•Œ๋ ค์ค€๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ DelegatingMemberComparer๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ์œ ํ˜•์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ DelegatingMemberComparer , a.Equals(b)๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ด์— ๋Œ€ํ•ด Likeness๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„ ๋งํฌ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ IEnumerable<TagDto> ๋Œ€ํ•œ DelegatingMemberComparer

์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ์—์„œ ์–ด๋–ค ์†์„ฑ์ด ๋‹ค๋ฅธ์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

์•„๋‹ˆ, ๊ทธ๊ฒŒ ๋ผ์ดํฌ๋‹ˆ์Šค๊ฐ€ ํ•˜๋Š” ์ผ์ด์•ผ...

Likeness๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ SemanticComparer<T> ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค... ๋”ฐ๋ผ์„œ SemanticComparer<T> ํ•˜๋ฉด ๋” ์œ ์—ฐํ•ด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ Likeness์˜ ๋ณด๊ณ  ๊ธฐ๋Šฅ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ณด๊ณ  ํ•ญ๋ชฉ ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด ์˜ˆ์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ Likeness์˜ With ๋ฐ EqualsWhen ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์‚ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž, ์ด์ œ ์›๋ž˜์˜ ์งˆ๋ฌธ์œผ๋กœ ๋Œ์•„์™”์Šต๋‹ˆ๋‹ค. ๋ณด๊ณ  ํ•ญ๋ชฉ์ด ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด(๋‚ด๊ฐ€ ์ฝ์€ ๊ฒƒ์—์„œ Likeness๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ) ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ฌด์—‡์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? .Equals(b), ์ฐธ์กฐ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ๊ฐœ์ฒด์˜ Equals ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งž๋‚˜์š”?

๊ทธ๋ ‡๋‹ค๋ฉด IEqualityComparers์™€ ํ•จ๊ป˜ xUnit Assert๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ์ด์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

AutoFixture๊ฐ€ ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ SemanticComparer๊ฐ€ ๋‚ด ์„ค์ •๋งŒํผ ๋‚ด ์ฃผ์žฅ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ค„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

SongDto ์— ๋Œ€ํ•œ 3๊ฐ€์ง€ ์˜ˆ(Likeness, SemanticComparer, IEqualityComparer)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฑฐ๊ธฐ์—์„œ ๊ณ„์† ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. - ์ง€๊ธˆ์€ ์ผ์ด ๋ฐ”๋น ์„œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ..

@moodmosaic ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!! ๊ทธ๋ฆฌ๊ณ  SemanticComparer์˜ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์‚ฌ๋กœ ์ €๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋งˆ๋„ ์ด ์ ์— ๋Œ€ํ•ด ๋œ ์ง‘์ค‘ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ฒฝ์šฐ https://github.com/jmansar/SemanticComparisonExtensions ๋ฅผ ํฐ ํšจ๊ณผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ ๋‚˜๋Š” ๋‚ด๋ฉด์˜ ๋ชจ์Šต์„ ์ œ์–ดํ•˜๊ณ  ์•ฝ๊ฐ„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ์ค‘์ฒฉ ๋น„๊ต๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ํ›Œ๋ฅญํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

@cvbarros ์ด๋Ÿฌํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ์€ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

ecampidoglio picture ecampidoglio  ยท  7์ฝ”๋ฉ˜ํŠธ

zvirja picture zvirja  ยท  4์ฝ”๋ฉ˜ํŠธ

mjfreelancing picture mjfreelancing  ยท  4์ฝ”๋ฉ˜ํŠธ

Ephasme picture Ephasme  ยท  3์ฝ”๋ฉ˜ํŠธ

JoshKeegan picture JoshKeegan  ยท  6์ฝ”๋ฉ˜ํŠธ