Autofixture: CoreCLR ์ง€์›

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

AutoFixture๋Š” ํ˜„์žฌ ์ƒˆ๋กœ์šด DNX ํ”Œ๋žซํผ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง€์›์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

enhancement good first issue

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

๋ชจ๋‘์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด - AutoFixture PR(#773)์— ๋Œ€ํ•œ .Net Standard ์ง€์›์ด v4 ๋ถ„๊ธฐ์— ๋ณ‘ํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์šฐ๋ฆฌ์˜ ๊ฐœ์ธ ํ”ผ๋“œ ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AutoFixture ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ธ€๋ฃจ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‚˜์ค‘์— ํ›„์† ์กฐ์น˜๋ฅผ ์ทจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์•„์ง, ์ ์–ด๋„. DNX๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ•˜ํ•˜.. ์ƒˆ๋กœ์šด ํฌ๋กœ์Šค ํ”Œ๋žซํผ asp.net ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. https://github.com/aspnet/DNX

๋Ÿฐํƒ€์ž„์€ "net451" ๋Œ€์‹  "dnx451" ๋“ฑ์ž…๋‹ˆ๋‹ค.

์ด ๋งฅ๋ฝ์—์„œ "์ง€์›"์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? .NET 4 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์žˆ๋Š” ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ASP.NET 5๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”?

ASPNET 5๋Š” ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ dnx ํ”Œ๋žซํผ์—์„œ๋งŒ ASPNET 5๋ฅผ ์ž‘์„ฑ ์ค‘์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ฝ”๋“œ๋Š” ํ˜„์žฌ "net451"์šฉ์œผ๋กœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ํ”Œ๋žซํผ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํ…Œ์ŠคํŠธ๋Š” ์ด project.json์œผ๋กœ ์ž˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

{
"์ข…์†์„ฑ": {

     "xunit.runner.dnx": "2.1.0-*",
     "xunit":"2.1.0-*",
    "AutoFixture.Xunit2":"3.30-*",
    "NSubstitute": "1.8.0",
    "ManagementWeb": "",
    "Microsoft.AspNet.Mvc": "6.0.0-beta4",
    "AutoFixture": "3.30.4-*",
    "AutoFixture.AutoNSubstitute": "3.30.4-*",
    "Microsoft.Azure.Documents.Client": "0.9.2-preview",
    "WindowsAzure.Storage": "4.4.1-*",
    "DeepEqual": "1.1-*"
},
 "frameworks": {
    "dnx451": { }
},
"commands": {
    "test": "xunit.runner.dnx"
}

}

ํฅ๋ฏธ๋กœ์šด. ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์ด ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์„ ๋„์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ–ˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”. IIRC Autofixture๋Š” ํ•ญ์ƒ aspnet 5์™€ ํ•จ๊ป˜ ์ž‘๋™ํ–ˆ์ง€๋งŒ ๊ณผ๊ฑฐ์—๋Š” xUnit ํ™•์žฅ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ AF์— ๋Œ€ํ•œ xUnit 2 ์ง€์›์ด ์ข…๋ฃŒ๋˜๊ณ  DNX์™€ xUnit์ด ํ•จ๊ป˜ ์ž˜ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์•„์ด๋””์–ด๋Š” DNX๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ "CoreCLR์— ๋Œ€ํ•œ ์ง€์›"์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. .NET Framework 4.5์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ DNX์˜ 4.5์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. CoreCLR์€ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ ์–ผ๋งˆ๋‚˜ ํ•˜๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•Œ์•„๋‚ด๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ CoreCLR์šฉ์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ๋ฌด์—‡์ด ์ค‘๋‹จ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๋ถ„๋ช…ํžˆํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. DNX๋ฟ๋งŒ ์•„๋‹ˆ๋ผ CoreCLR์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

coreclr repo ๋งŒ ๋ณด๋ฉด ํ”„๋กœ์ ํŠธ ํ˜„ํ™ฉ์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ธ๊ฐ€์š”? ๋ฒ ํƒ€? ์ถœ์‹œ ๋œ?

์ „ํ˜€ ์‹œ๋„ํ•˜์ง€ ์•Š๊ณ  ์ง€์›๋˜๋Š” ๊ธฐ๋Šฅ์ด ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์˜ ๊ต์ฐจ์ ์ด๋ผ๋Š” ์ ์—์„œ CoreCLR์ด Portable Class Libraries์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  CoreCLR์—์„œ ์‹คํ–‰๋˜๋„๋ก AutoFixture๋ฅผ ๊ฐœ์กฐํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ์— @moodmosaic ์€ AtomEventStore(AutoFixture๋ณด๋‹ค ํ›จ์”ฌ ์ž‘์€ ํ”„๋กœ์ ํŠธ)์— ๋Œ€ํ•œ ๋ถ„์„ ์„ ํ•  ์ •๋„๋กœ ์นœ์ ˆํ–ˆ๊ณ 

AutoFixture ์†Œ์Šค๋ฅผ ์ „ํ˜€ ๋ณด์ง€ ์•Š๊ณ  ๊ท€ํ•˜์˜ ํ‰๊ฐ€์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #if DNX_* - ์ง€์›์ด ๊ณ„ํš์— ์žˆ๋Š” ๊ฒฝ์šฐ ์Šคํƒ€์ผ ์ง€์‹œ๋ฌธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

CoreCLR์€ Windows Phone 8 ์ดํ›„๋กœ ์–ด๋Š ์ •๋„ ์‹คํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ASP.NET 5๋Š” 11์›”์— RC๊ฐ€ ๋  ๊ฒƒ์ด๋ฉฐ Linux ๋ฐ Mac์šฉ CoreCLR๋„ 2015๋…„ 11์›”์— RC๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. CoreFX์™€ ํ•จ๊ป˜. 2016๋…„ 1๋ถ„๊ธฐ์— ๊ณ„ํš๋œ ๋ชจ๋“  ๊ฒƒ์„ ์œ„ํ•œ ๋ฆด๋ฆฌ์Šค 1.0.

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ  CoreCLR์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋งค์šฐ ๋†€๋ž„ ๊ฒƒ์ด๋ฏ€๋กœ ์ด ๋ฌธ์ œ์— _4.0_ ์ด์ •ํ‘œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜ธ๊ธฐ์‹ฌ์— Ploeh.AutoFixture ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ API ์ด์‹์„ฑ ๋ถ„์„๊ธฐ ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

autofixture-compatibility

์ƒดํŽ˜์ธ์„ ์—ด๊ธฐ ์ „์— ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค. ๋ถˆํ–‰ํžˆ๋„ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ธฐํ˜ธ์˜ ๋Œ€๋žต 3%๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์†Œ ๊ธฐ๋ณธ์ ์ธ ๊ธฐํ˜ธ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

| ๋Œ€์ƒ ์œ ํ˜• | ๋Œ€์ƒ ํšŒ์› |
| --- | --- |
| ์‹œ์Šคํ…œ.์ฝ˜์†” | M:System.Console.get_Out |
| ์‹œ์Šคํ…œ.์Šค๋ ˆ๋”ฉ.์Šค๋ ˆ๋“œ | M:System.Threading.Thread.get_ManagedThreadId |
| ์‹œ์Šคํ…œ.์Šค๋ ˆ๋”ฉ.์Šค๋ ˆ๋“œ | M:System.Threading.Thread.get_CurrentThread |
| System.Reflection.ICustomAttributeProvider | M:System.Reflection.ICustomAttributeProvider.GetCustomAttributes(System.Type,System.Boolean) |
| System.Net.Mail.Mail์ฃผ์†Œ | M:System.Net.Mail.MailAddress.#ctor(System.String) |
| System.Serializable์†์„ฑ | M:System.SerializableAttribute.#ctor |
| ์‹œ์Šคํ…œ.๋Ÿฐํƒ€์ž„.์ง๋ ฌํ™”.์ง๋ ฌํ™” ์ •๋ณด | T:System.Runtime.Serialization.SerializationInfo |
| System.Reflection.ParameterInfo | M:System.Reflection.ParameterInfo.IsDefined(System.Type,System.Boolean) |
| ์‹œ์Šคํ…œ.์œ ํ˜• | M:System.Type.get_IsGenericTypeDefinition |
| ์‹œ์Šคํ…œ.์œ ํ˜• | M:System.Type.get_IsEnum |
| ์‹œ์Šคํ…œ.์œ ํ˜• | M:System.Type.get_BaseType |
| ์‹œ์Šคํ…œ.์œ ํ˜• | M:System.Type.get_IsPrimitive |
| ์‹œ์Šคํ…œ.์œ ํ˜• | M:System.Type.get_Assembly |
| ์‹œ์Šคํ…œ.์œ ํ˜• | M:System.Type.get_IsGenericType |
| ์‹œ์Šคํ…œ.์œ ํ˜• | M:System.Type.GetTypeCode(System.Type) |
| ์‹œ์Šคํ…œ.์œ ํ˜• | M:System.Type.get_IsClass |
| ์‹œ์Šคํ…œ.์œ ํ˜• | M:System.Type.get_IsValueType |
| ์‹œ์Šคํ…œ.์œ ํ˜• | M:System.Type.get_IsAbstract |
| System.Reflection.MemberInfo | M:System.Reflection.MemberInfo.get_ReflectedType |
| System.Reflection.PropertyInfo | M:System.Reflection.PropertyInfo.GetSetMethod |
| ์‹œ์Šคํ…œ ์˜ˆ์™ธ | M:System.Exception.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext) |
| System.Reflection.MethodBase | M:System.Reflection.MethodBase.GetCurrentMethod |

๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • System.Type ์˜ ์†์„ฑ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ GetTypeInfo(Type) ํ™•์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” System.TypeInfo ์˜ ํ•ด๋‹น ์ฐธ์กฐ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • System.SerializableAttribute ๋Œ€ํ•œ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • System.Runtime.Serialization.SerializationInfo ๋Œ€ํ•œ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค(_์˜ˆ์™ธ ์ƒ์„ฑ์ž_์—์„œ๋งŒ ์‚ฌ์šฉ๋จ).
  • System.Net.Mail.MailAddress ๋Œ€ํ•œ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • System.Reflection.MemberInfo.ReflectedType ์†์„ฑ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ˜์‚ฌ๋œ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์œ ํ˜•์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • System.Reflection.PropertyInfo.GetSetMethod ์†์„ฑ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ๋Œ€์‹  System.Reflection.PropertyInfo.SetMethod ์†์„ฑ์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ผ ๋ฟ์ด๋ฉฐ CoreCLR์ด ์•„์ง ๊ฐœ๋ฐœ ์ค‘์ด๋ฏ€๋กœ ์ƒํ™ฉ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” AutoFixture๊ฐ€ ๊ทธ๊ฒƒ๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

์™€์šฐ, ์ด ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. @ecampidoglio :+1:

์ผ๋ถ€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์œ ํ˜•(์˜ˆ: MailAddress )์€ ์ „์ฒด ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ๋ฒ„์ „ 4์šฉ _Ploeh.AutoFixture_ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ผ๋ถ€ ๊ธฐ๋Šฅ ์„

PropertyInfo.GetSetMethod ๋ฅผ PropertyInfo.SetMethod ๋กœ ๋ฐ”๊พธ๋Š” ์•„์ด๋””์–ด๋Š” ์ข‹์Šต๋‹ˆ๋‹ค. AFAICT, .NET 4.5 ์ด์ƒ์—์„œ๋งŒ ์ž‘๋™ํ•˜์ง€๋งŒ _v4_ ๋ถ„๊ธฐ๊ฐ€ ์ด๋ฏธ .NET 4.5์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

"Jump In" ๋ ˆ์ด๋ธ”์ด ์ด ๋ฌธ์ œ์— ์ ํ•ฉํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๋‹นํžˆ ์‰ฝ๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ์—ฌ์ž ์นœํ™”์  ์ธ ์ž‘๊ณ  ๊ณ ๋ฆฝ ๋œ ํ•œ์ž… ํฌ๊ธฐ์˜ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ฝ”๋“œ ๊ธฐ๋ฐ˜๊ณผ ๊ทธ ์—ญ์‚ฌ์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ์ƒ๋‹นํžˆ ์ž˜ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@chaitanyagurrapu , ์•„๋งˆ๋„ ๋‹น์‹ ์ด ์˜ณ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ _jump in_ ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•œ ์ด์œ ๋Š” ์ด ์ž‘์—…์ด AutoFixture ์„ธ๋ถ€ ์ •๋ณด์™€ ๋‹ค์†Œ ๊ด€๋ จ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ: ๋‹ค์–‘ํ•œ ๋น„ํ˜ธํ™˜์„ฑ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ ค์•ผ ํ•˜์ง€๋งŒ CorCLR๊ณผ ๊ด€๋ จ๋œ ์ „์ฒด ์ฝ”๋“œ/๋นŒ๋“œ ์ธํ”„๋ผ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋ฉฐ ๊ทธ ๋ถ€๋ถ„์€ AutoFixture์™€ ์ „ํ˜€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋กœ์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์ด ์—†์œผ๋ฏ€๋กœ ๋„์›€์„ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ๋‚ด๋ ค์•ผ ํ•  ๊ฒฐ์ •์€ ์—ฌ๊ธฐ ๋˜๋Š” ์ „์šฉ Github ๋ฌธ์ œ์—์„œ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์‹œ์ž‘ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋‚˜์˜ฌ ์งˆ๋ฌธ๋“ค :)

๋‚˜์—๊ฒŒ ์ข‹์€ ์†Œ๋ฆฌ :+1:

@lbargaoanu ์ข‹์€ ์†Œ๋ฆฌ:+1: ๊ฐ€๋Šฅ ํ•˜๋ฉด ์ž‘๊ฒŒ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค .

.NET Core์šฉ AutoFixture๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก MailAddressGenerator๋ฅผ v4 ๋ถ„๊ธฐ์˜ ์ „์ฒด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋กœ ์ด๋™ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. .NET Core์— ๋Œ€ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ์ž ์œ ํ˜•์„ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€๋Š” ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ์„ ํ”ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ญ์ƒ ์ „์ฒด ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋งŒ ์ง€์›๋˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž‘์—…์ค‘ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋™์•ˆ...

ํ–ฅํ›„ ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด
https://blogs.msdn.microsoft.com/dotnet/2016/02/10/porting-to-net-core/

์ข‹์€ ๊ฒŒ์‹œ๋ฌผ! ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํฌํ•จ๋˜๋‚˜์š”? (_library_๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์ง€๋งŒ ๋งŽ์ด ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค...)

:) ์ด๊ฒƒ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ด€ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์ด ๊ฒŒ์‹œ๋ฌผ๊ณผ ๋งํฌ๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

AutoFixture๊ฐ€ CoreCLR์—์„œ๋„ ์ž‘๋™ํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด๊ณ  ์‹ถ๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ธฐ๊บผ์ด ๋„์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Lucian Bargaoanu(#511, #513)์˜ ๋งˆ์ง€๋ง‰ PR์„ ๋ณด๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ์ผ๋ถ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ํ† ๋ก ์—์„œ ์ง„๋ถ€ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ณต์„ ๊ตด๋ฆฌ๊ณ  ์‹ถ์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ๊ณ„ํš์ด ๋ฌด์—‡์ธ์ง€, ํ† ๋ก ์„ ๋ฐฉํ•ดํ•˜๋Š” ์ผ๋ถ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์ด์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฃผ์œ„์— ๋–  ๋‹ค๋‹ˆ๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ฑฐ๋‚˜ ๋‚˜ ์ž์‹ ์ด ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ :

  • AutoFixture๋ฅผ PCL๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๊ณต์œ  ํ”„๋กœ์ ํŠธ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • ์–ด๋–ค ํ”Œ๋žซํผ์ด ํ™•์‹คํžˆ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์žฅ๊ธฐ์ ์œผ๋กœ ์›ํ•ฉ๋‹ˆ๊นŒ? (.NET, CoreCLR, UWP?)
  • ์ด์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์— ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@ploeh ์ด ๋ชจ๋“  ์งˆ๋ฌธ์— ๋‹ตํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ํ•ต์‹ฌ ๊ธฐ์—ฌ์ž๊ฐ€ ์ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @lbargaoanu ์ด์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด ์žˆ์œผ์‹ ๊ฐ€์š”? ๊ฐ์‚ฌ ํ•ด์š”!

์ด ์Šค๋ ˆ๋“œ์— ๋‹ต์žฅํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์‚ฌ๊ณผ๋ฅผ ๋ฐ›์•„์ฃผ์„ธ์š” :ํ”Œ๋Ÿฌ์‹œ:

.NET Core์šฉ AutoFixture ์ฝ”๋“œ ๊ธฐ๋ฐ˜์„ ์ค€๋น„ํ•˜๊ธฐ ์œ„ํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ž‘์—…์€ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์„ ์ €ํ•˜์‹œํ‚ค๊ฑฐ๋‚˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋„์ž…ํ•˜์ง€ ์•Š๋Š” ํ•œ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€๋Šฅํ•˜์ง€๋งŒ _v4_ ๋ถ„๊ธฐ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ์ •๋‹นํ•˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ๋Š” ์ •๋‹นํ•œ ๊ทผ๊ฑฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. .NET Core ์ƒํ™ฉ์„ ๋ฉด๋ฐ€ํžˆ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์—ฌ์ „ํžˆ ๋งŽ์€ ์Šค๋ž˜์‹ฑ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๊ณ  ๋Œ€์ƒ์ด ๊ณ„์† ์›€์ง์ด๋Š” ํ•œ ์ถ”์ธก์ ์ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋„์ž…ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜๋”๋ผ๋„ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ ์ œ์ •์‹ ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์•„๋งˆ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ๋งŽ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์–ด๋–ค ํ”Œ๋žซํผ์ด ํ•„์š”ํ•œ์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  AutoFixture์˜ ๋ฒ”์œ„๋ฅผ ํ™•์žฅํ•˜๋Š” pull ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์ˆ˜๋ฝ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

AFAICT, ์šฐ๋ฆฌ๋Š” netstandard1.X ๋ฅผ ๋ชฉํ‘œ๋กœ ์‚ผ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ(Windows์˜ ๋„ท์ฝ”์–ด ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ฐ ๋„ท ํ”„๋ ˆ์ž„์›Œํฌ ํฌํ•จ)์—์„œ ์‹คํ–‰๋˜๋Š” API ์„ธํŠธ์ž…๋‹ˆ๋‹ค.

https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md ์ฐธ์กฐ

์ผ๋ฐ˜์ ์œผ๋กœ ์ˆซ์ž๊ฐ€ ๋†’์„์ˆ˜๋ก API๋Š” ๋” ๋งŽ์ง€๋งŒ ์ง€์›๋˜๋Š” ํ”Œ๋žซํผ์€ ์ ์Šต๋‹ˆ๋‹ค. netstandard1.X ์—์„œ ์–ด๋–ค X๋ฅผ ๋ชฉํ‘œ๋กœ ์‚ผ์•„์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•จ์œผ๋กœ์จ ์ด ํ† ๋ก ์„ ์‹œ์ž‘(๊ณ„์†)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋ฌธ์„œ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๋ฝ์€ ์ €๋ฅผ ์•ฝ๊ฐ„ ๋‘๋ ต๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

.NET ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์ถ•์˜ ๋ฏธ๋ž˜์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ๊ณ„ํš์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
-- https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md

@moodmosaic ์ €๋„ ๋‘๋ ต์ง€ ๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ๋ชฉํ‘œ๋กœ ์‚ผ์„ API๋ฅผ ์„ ํƒํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…์€ ๋ณธ์งˆ์ ์œผ๋กœ ์–ด๋Š ์ชฝ์ด๋“  ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. netstandard๋Š” ๋‹จ์ง€ ๊ทธ๋“ค์—๊ฒŒ ์ž˜ ์•Œ๋ ค์ง„ ์ด๋ฆ„๊ณผ ํ•ฉ์˜๋œ ๋ถ€๋ถ„์ง‘ํ•ฉ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์„ ์„ค๋ช…ํ•˜๋Š” ๋” ์‰ฌ์šด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ํœด๋Œ€ํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด AutoFixture์šฉ ๋ฆฌํ”Œ๋ ‰์…˜ API๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ ๋ชฉ๋ก์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋™์‹œ ์ˆ˜์ง‘์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ํ”Œ๋žซํผ์€ ์ด๋ฏธ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—(net framework full, Windows phone ๋“ฑ), ์–ด๋–ค API๊ฐ€ ํ•„์š”ํ•œ์ง€ ๋…ผ์˜ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ™”๋ฅผ [๋‹ค์‹œ] ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค... (๋ฉด์ฑ… ์กฐํ•ญ: ์ €๋„ ์•„์ง ์ด ๋‚ด์šฉ์„ ๋ฐฐ์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)

๊ฐ€์žฅ ๋งŽ์€ ์ˆ˜์˜ ํ”Œ๋žซํผ์— ์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฒƒ( netstandard1.0 )๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ํ•ด๋‹น ํ”Œ๋žซํผ์— ์ปค๋ฐ‹ํ•  ์ˆ˜ ์—†๋Š”(๋˜๋Š” ํ•˜์ง€ ์•Š์„) ์ด์œ ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ดํ•ด์— ๋”ฐ๋ฅด๋ฉด netstandard1.0 API ์„ธํŠธ๋Š” ๊ฝค ์˜ค๋ž˜๋˜๊ณ  ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค.

  • System.Linq.Parallel ( netstandard1.1 ๋ถ€ํ„ฐ ์‹œ์ž‘)
  • System.Console( netstandard1.3 ๋ถ€ํ„ฐ ์‹œ์ž‘)
  • System.Collections.Concurrent( netstandard1.1 ๋ถ€ํ„ฐ ์‹œ์ž‘)
  • System.ComponentModel.Annotations( netstandard1.1 ๋ถ€ํ„ฐ ์‹œ์ž‘)
  • System.Collections.Specialized ( netstandard1.3 ๋ถ€ํ„ฐ ์‹œ์ž‘)

์ด๊ฒƒ์€ AutoFixture๊ฐ€ netstandard1.0 ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์‹ค์šฉ์ ์ด์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ @ecampidoglio ๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋ถ„์„๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ์ „๋žต์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์—ฌ๊ธฐ์— .NET API ์ด์‹์„ฑ ๋ถ„์„๊ธฐ ๋„๊ตฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ์›น ์‚ฌ์ดํŠธ http://dotnetstatus.azurewebsites.net์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€ ์ŠคํŒธ์ด ๋„ˆ๋ฌด ๋งŽ์•„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๊ทธ๋งŒํ• ๊ฒŒ์š” :)

์ฐธ๊ณ ๋กœ ์ €๋Š” v4 4a7d415์—์„œ ๋กœ์ปฌ๋กœ ๋นŒ๋“œ๋œ Ploeh.AutoFixture.dll์—์„œ ์ตœ์‹  ์ด์‹์„ฑ ๋ถ„์„๊ธฐ๋ฅผ ์‹คํ–‰ํ–ˆ์œผ๋ฉฐ ์š”์•ฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง‘ํšŒ.NET ์ฝ”์–ด, ๋ฒ„์ „=v5.0.NET ํ”„๋ ˆ์ž„์›Œํฌ, ๋ฒ„์ „=v4.6.2.NET ํ”Œ๋žซํผ, ๋ฒ„์ „=v5.0
Ploeh.AutoFixture, ๋ฒ„์ „=3.45.2.0, ๋ฌธํ™”=์ค‘๋ฆฝ, PublicKeyToken=null (.NETFramework, ๋ฒ„์ „=v4.5)98.56%100.00%98.37%

ํ˜„์žฌ ๊ถŒ์žฅํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
screen shot 2016-05-11 at 11 36 16

์ „์ฒด ์ถœ๋ ฅ์€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค .

@ploeh ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” Asp.Net Core ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ์ตœ์†Œ netstandard1.3 ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด EntityFrameworkCore(1.3 ์‚ฌ์šฉ) ๋ฐ Mvc(1.6 ์‚ฌ์šฉ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Autofixture๊ฐ€ ์ด ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ธฐ์ค€์„ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์ข‹์€ ์œ„์น˜์— ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

.Net Core ์ง€์›์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ •์ด ์žˆ์Šต๋‹ˆ๊นŒ?

v4 ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ .NET Core์—์„œ ๋นŒ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๋ธŒ๋žœ์น˜๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

FWIW, ๋‹ค์Œ ์€ AutoFixture/AutoFixture v4์™€ uhaciogullari/AutoFixture net-core ๊ฐ„์˜ ๋น„๊ต ์ž…๋‹ˆ๋‹ค. ์ž˜ ๋ณด๊ณ  ๊ฐ‘๋‹ˆ๋‹ค ๐Ÿ‘

๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ์ •๋ง ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. project.json์ด ์กด์žฌํ•˜๋ฉด ํ˜„์žฌ ์ผ๋ฐ˜ csproj ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๋ฅผ project.json ํ˜•์‹์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ํ™•์ธํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์˜์‹ฌ๋ฉ๋‹ˆ๋‹ค. .NET Core๋„ ์ง€์›ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์‚ฌ์‹ค์€ Microsoft ๊ฐ€ ๊ฒƒ์ด๋ผ๊ณ  ๋ฐœํ‘œ ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์‰ฌ์šด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์•ฝ์†ํ•˜์ง€๋งŒ ์ด ์ž„์‹œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋ชจ๋‘ ๋‹น์‹ ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ธŒ๋žœ์น˜์—์„œ ํŒจํ‚ค์ง€๋ฅผ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ v4๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ์—†์ด ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. #712

์‹ค์ œ๋กœ ์ง€์ ์—์„œ ๋นŒ๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ dll์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ตฌ์„ฑ์ด ๋ˆ„๋ฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ ํด๋”๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ฏธํ•™์ ์œผ๋กœ ์ €์—๊ฒŒ ๋งค๋ ฅ์ ์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

.net ํ•ต์‹ฌ ๋„๊ตฌ๊ฐ€ RTM ์ƒํƒœ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ csproj ๋„๊ตฌ๋Š” VS2015๋กœ ์ด์‹๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ VS2017์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://twitter.com/TheCodeJunkie/status/822048014172880900 ์ฐธ์กฐ

@hoetz ๋‹น์‹ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹vs2017 ์ปค๋ฎค๋‹ˆํ‹ฐ ์—๋””์…˜์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๊ฒ€ํ† ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

AitoFixture ์—†์ด .NET ํ‘œ์ค€ ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๋‚˜์œ ์ผ์ž…๋‹ˆ๋‹ค...

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฐธ์—ฌํ•˜๊ณ  ๊ธฐ์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ชจ๋ธ ๋ฌธ์ œ๊ฐ€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ๋‹น์žฅ์€ ๋ถ„๋ช…ํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค(#703). ๋ˆ„๊ตฐ๊ฐ€๋„ ์•ž์žฅ์„œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ Src\AutoFixture.sln์—๋งŒ ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ „๋žต์€ .NET Framework์™€ .NET Standard๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก Src\AutoFixture\AutoFixture.csproj๋ฅผ ์ƒˆ ํ”„๋กœ์ ํŠธ ํ˜•์‹(VS 2017)์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

.NET ์ด์‹์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์œผ๋ฉฐ ์ตœ์ƒ์˜ ๋Œ€์ƒ์€ .NET Standard 1.5์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ฒจ๋ถ€ ํŒŒ์ผ ์ฐธ์กฐ).

์šฐ์„  ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ฒ ์ง€๋งŒ ํ–ฅํ›„ .NET Core ๋Ÿฐํƒ€์ž„์—์„œ๋„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

AutoFixtureNetPortabilityTest.zip

์•ˆ๋…•ํ•˜์„ธ์š” @Kralizek - ์ฐธ๊ณ ๋กœ ์ €๋Š” #712์—์„œ netstandard1.3 ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

@Kralizek ๋‚ด ์‹ค์ˆ˜, netstandard1.3 ๊ณ„ํš์„ ์‹œ์ž‘ํ•œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” netstandard1.5 ๋๋‚ฌ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

๊ฑฐ์˜ ๋‹ค ์™”์–ด. ํ…Œ์ŠคํŠธ๋Š” .NET Framework์—์„œ ๋ชจ๋‘ ๋…น์ƒ‰์ž…๋‹ˆ๋‹ค. ๋นŒ๋“œ๋Š” .NET Standard์—์„œ ๋ชจ๋‘ ๋นจ๊ฐ„์ƒ‰์ž…๋‹ˆ๋‹ค. :๋””

๋‹ค์Œ ๋ฒ”์ฃผ์˜ ๋ฌธ์ œ๋งŒ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋ฐœ์ „๊ธฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ
System.Net.Mail.MailAddress ๋Š” .NET Standard์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— MailAddressGenerator ํ•œ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜: ์ „์ฒด ํŒŒ์ผ์ด #if NET40 ... #endif์— ์˜ํ•ด "์ œ๊ฑฐ"๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ง๋ ฌํ™”
SerializableAttribute, SerializationInfo ๋ฐ StreamingContext๋Š” .NET Standard์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Exception์—๋Š” ์ด ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์˜ˆ์™ธ์—์„œ ์†์„ฑ๊ณผ ํ•ด๋‹น ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์•„๋ฆ„๋‹ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ํ˜•์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ๋ฆฌํ”Œ๋ ‰์…˜ ์‚ฌ์šฉ
.NET Standard์—์„œ๋Š” Type ๊ฐ€ ํ›จ์”ฌ ๋‚˜์ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์€ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์†์„ฑ์„ ํฌํ•จํ•˜๋Š” TypeInfo ๊ฐœ์ฒด์— ์œ„์ž„๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” .NET Framework๊ฐ€ ์—ฌ์ „ํžˆ ์ด์ „ Type ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ์ฑ…:
๋™์ผํ•œ Type ๊ฐœ์ฒด public static Type GetTypeInfo(this Type type) => type; ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํ™•์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด ํ™•์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์‹œ๋ฌธ์„ ํ†ตํ•ด .NET Framework์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠธ๋ฆญ์€ ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ๋‘” ์ฑ„๋กœ ๋งŽ์€ ๋น„ํ˜ธํ™˜์„ฑ์„ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ : ํ™•์žฅ ๋ฉ”์„œ๋“œ๋Š” internal ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์–ด์…ˆ๋ธ”๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ
์ข‹์•„, ์ด๊ฒƒ์€ ํ”„๋กœ์ ํŠธ ๋ ˆ์ด์•„์›ƒ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ค์šด ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ReSharper๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ–ˆ์ง€๋งŒ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ผ์€ TerminatingWithPathSpecimenBuilder ์ด๊ณ  ํ–‰์€ var thisAssembly = MethodBase.GetCurrentMethod().DeclaringType.Assembly; ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์†ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค์—๋Š” ์ƒ์†์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ typeof(TerminatingWithPathSpecimenBuilder).DeclaringType[.GetTypeInfo()].Assembly ๊ฐ€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€๋งŒ ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ œ๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. (์ €๋Š” ๊ฐ€์งœ ํ™•์žฅ ๋ฐฉ๋ฒ•์„ ๊ด„ํ˜ธ ์•ˆ์— ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค). ๋‚ด ๊ฐ€์ •์ด ๋งž๋‹ค๋ฉด ์ด ํด๋ž˜์Šค๋ฅผ sealed ํ•˜์—ฌ ์ƒ์†๋˜์–ด ์†์ƒ๋  ์œ„ํ—˜์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net40;netstandard1.5</TargetFrameworks>
    <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
    <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
    <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
    <GenerateAssemblyVersionAttribute>false</GenerateAssemblyVersionAttribute>
    <GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>
    <GenerateAssemblyTitleAttribute>false</GenerateAssemblyTitleAttribute>
    <GenerateAssemblyDescriptionAttribute>false</GenerateAssemblyDescriptionAttribute>
  </PropertyGroup>
  <ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
  </ItemGroup>
  <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.5' ">
    <PackageReference Include="System.ComponentModel.Annotations" Version="4.1.0" />
  </ItemGroup>
</Project>

์˜ˆ, ์ด๊ฒƒ์€ ์ „์ฒด ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

@Kralizek ๋‹น์‹ ์€ ์šฐ๋ฆฌ๊ฐ€ v4 ๋ธŒ๋žœ์น˜ ์—์„œ >= net45 ๋ฅผ ๋ชฉํ‘œ๋กœ ์‚ผ์œผ๋ ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๊นŒ?

@adamchester nope... ๋ณ„๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ๋Œ€์ƒ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ‘

Btw, System.Threading.Thread ํŒจํ‚ค์ง€ ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ˆ˜์ค€์˜ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜๋ฅผ ์ž ๊ธˆ ํ•ด์ œํ–ˆ์Šต๋‹ˆ๋‹ค... ๋ฉ‹์ง€๋„ค์š” :P

.NET Standard 2.0 ๋งŽ์€ API๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆด๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. .NET Standard 2.0์€ 2017๋…„ 3๋ถ„๊ธฐ์— ์ถœ์‹œ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. .NET Standard 1.5 ์ง€์›์ด ํ•œ ๋ฒˆ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค. ์™œ 2.0์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋Ÿฐํƒ€์ž„์— ๋ฉ”์ผ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ 2.0์€ ๋Œ€๋ถ€๋ถ„ ํ”„๋ ˆ์ž„์›Œํฌ 4.6์˜ shim์ด ๋  ๊ฒƒ์ด๋ฉฐ NotSupportedException์ด ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@Kralizek ์ถฉ๋ถ„ํžˆ ๊ณต์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋” ๋นจ๋ฆฌ ๋ฆด๋ฆฌ์Šค๋œ autofixter๋ฅผ ์ข‹์•„ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋” ์ผ๋ฐ˜์ ์ธ ์งˆ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

FWIW, ์ €๋Š” ๋ฉ”์ผ ์ฃผ์†Œ ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•œ ๊ณตํ—Œ์ž์ž…๋‹ˆ๋‹ค. AutoFixture๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฅผ ์ง€์›ํ•˜๋„๋ก ๋งŒ๋“  ๊ฒƒ์€ ์ข‹์ง€๋งŒ AutoFixture์˜ ์ค‘์š”ํ•œ ์ธก๋ฉด์€ ์•„๋‹ˆ๋ฉฐ ๋…ธ๋ ฅํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข€ ๊ธฐ๋‹ค๋ ค.

๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋‚ฎ์€ .NET Standard์—์„œ AutoFixture๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ IMHO์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†ํ•ด์„œ ์ข‹์€ ์ผ์„ ํ•˜์„ธ์š”. ๋„์›€์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์ง€์›์ด ํ•„์š”ํ•˜๋ฉด ์ œ๊ฐ€ ํ™•์‹คํžˆ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Kralizek TypeInfo ํ•ญ๋ชฉ๋„ .NET 4.5์— ์žˆ์œผ๋ฏ€๋กœ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์—ฌ๋Ÿฌ .NET Core ํ”„๋กœ์ ํŠธ์— ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ "Package AutoFixture 3.50.5 is not compatible with netcoreapp1.1 (.NETCoreApp,Version=v1.1)" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋งค์šฐ ์œ ์šฉํ•œ nuget ํŒจํ‚ค์ง€๋ฅผ ์ด ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ธฐ์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•˜๋Š” ".net core์˜ autofixture ์ƒํƒœ" ์ข…๋ฅ˜์˜ ์‘๋‹ต์„ ์š”์ฒญํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(.net core 2.0์€ ์ด๋ฏธ rtm์ด๊ณ  ๋ฆด๋ฆฌ์Šค ๋ณด๋ฅ˜ ์ค‘์ž…๋‹ˆ๋‹ค.) .

๋ฌด์—‡์ด ๊ทธ๊ฒƒ์„ ๋ง‰๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? (๋ฏธ๋ฆฌ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค)

ํ˜„์žฌ ์ž‘์—… ์ค‘์ด๋ฉฐ #773์—์„œ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด PR์€ AutoFixture ํ”„๋กœ์ ํŠธ ์ž์ฒด์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•  ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๊ฐ€ 9๊ฐœ ๋” ์žˆ์ง€๋งŒ ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ž‘์—…์„ ๋งˆ์นœ ํ›„์—๋งŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

.NET Core ์ง€์›์€ v4๋กœ ์ถœ์‹œ๋  ์˜ˆ์ •์ด๋ฉฐ ์—ฌ๊ธฐ ์—์„œ ์ „์ฒด ๋ฒ”์œ„๋ฅผ ์ฐพ์„ ์ˆ˜

๊ทธ ๋™์•ˆ Dev NuGet ํ”ผ๋“œ(#762)๋„ ์ž‘์—… ์ค‘์ด๋ฏ€๋กœ ์ดˆ๊ธฐ ์ œํ’ˆ ํ…Œ์ŠคํŠธ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰

@zvirja ์ž์„ธํ•œ ์—…๋ฐ์ดํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋„ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์ œํ’ˆ ํ…Œ์ŠคํŠธ์— ์ฐธ์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@zvirja ๊ทธ๋ž˜์„œ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด - .NET Core ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ˜„์žฌ(์ž„์‹œ) ์ ‘๊ทผ ๋ฐฉ์‹์€ AutoFixture ๋ฅผ .NET 4.7 ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— .NET Core๋กœ?

์ด๊ฒƒ์ด ๋‹น๋ถ„๊ฐ„ ์ œ์•ˆ๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ? (๋‚ด๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ์•ฑ์ด ์™„์ „ํžˆ .NET Core๊ฐ€ ๋˜๋„๋ก ํ—ˆ์šฉ๋˜๋Š” ํ•œ, ์‹ค์ œ๋กœ ์ผ๋ฐ˜ .NET 4.7 ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

@andersborum ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. v3์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  API(NuGet์— ๊ฒŒ์‹œ๋œ ํŒจํ‚ค์ง€)๊ฐ€ .Net Standard 2.0๊ณผ ํ˜ธํ™˜๋˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(.NET Standard์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด).

v3์™€ .Net Core๋ฅผ ๋ชจ๋‘ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์กฐ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰

๋ชจ๋‘์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด - AutoFixture PR(#773)์— ๋Œ€ํ•œ .Net Standard ์ง€์›์ด v4 ๋ถ„๊ธฐ์— ๋ณ‘ํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์šฐ๋ฆฌ์˜ ๊ฐœ์ธ ํ”ผ๋“œ ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AutoFixture ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ธ€๋ฃจ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‚˜์ค‘์— ํ›„์† ์กฐ์น˜๋ฅผ ์ทจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ŒํŒŒ ๋ฒ„์ „์ด๋ผ๋„ v4๋ฅผ nuget.org๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ๊นŒ์ง€ .netstandard๋ฅผ ์ง€์›ํ•˜๋Š” autofixture์™€ ๋น„์Šทํ•œ ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
v4์˜ ์ถœ์‹œ์ผ์€ ์ด๋ฏธ ๊ฒฐ์ •๋˜์—ˆ๋‚˜์š”?

@RomanKernSW ์ง€๊ธˆ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์•„์ง ํ”„๋กœ์ ํŠธ์˜ ์ ˆ๋ฐ˜๋„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ(์˜ˆ: xUnit, NUnit, NSubstitute ์ง€์›) ๋„ˆ๋ฌด ์ด๋ฆ…๋‹ˆ๋‹ค. ๋˜ํ•œ ์šฐ๋ฆฌ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ฆด๋ฆฌ์Šค ์‚ฌ์ด์— ์ฃผ์š” ์ค‘๋‹จ์ด ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— master ๋ฅผ v4 ์ง€์†์ ์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ•œ ๋‚˜์ค‘์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ํ›„์— ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์ง€์˜ฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋น„๊ณต๊ฐœ ํ”ผ๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ NuGet.config ๋ฅผ ํ†ตํ•ด ํ”ผ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ  nuget ๋ณต์›(.Net Core 2 - VSO์—์„œ ์ž‘์—… ๋ฏธ๋ฆฌ๋ณด๊ธฐ)์— nuget.config๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ nuget.config ํŒŒ์ผ์ด ์—†๋Š” nuget.org๊ฐ€ ํฌํ•จ๋œ ๋น„๊ณต๊ฐœ ํ”ผ๋“œ(VSO)๊ฐ€ ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธํ•  ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค...

.Net Standard 2.0์—๋Š” .Net Framework NuGet์— ๋Œ€ํ•œ ํ˜ธํ™˜์„ฑ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
AutoFixture 3.50.x๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ .Net Core ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋ฉ€๋ฆฌ.

@roarwrecker ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค, ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! NuGet์— ๋Œ€ํ•œ ๊ณต์‹ ์ง€์›์„ ์ถœ์‹œํ•  ๋•Œ๊นŒ์ง€ ๋” ํฐ ์‹œ๊ฐ„ ๋ฒ„ํผ๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.wink:

@roarwrecker ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค... ์ด๊ฒƒ์€ .netstandard 1.6์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๊ฒŸ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ค๋ฅ˜ ์—†์ด ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, .NetCore ์ž‘์—…์ด ์–ผ๋งˆ๋‚˜ ์ง„ํ–‰๋˜์—ˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ NuGet์—์„œ ์•ŒํŒŒ ๋ฒ„์ „์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@selmendorfFrontline ์—ฌ๊ธฐ ์—์„œ ๋‹ต์žฅ ๋ณต์‚ฌ:

์‹œํ—˜ํŒ ๋ฒ„์ „์„ NuGet์— ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์•ฝ๊ฐ„ ๊ณ ํ†ต์Šค๋Ÿฌ์šด ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด .NET Core๋ฅผ ์ง€์›ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฅผ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด๊ฒƒ์€ ์šฐ๋ฆฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์—„์ฒญ๋‚œ ๋ณ€๊ฒฝ์ด ๋  ๊ฒƒ์ด๋ฉฐ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ์„ ๋ฉˆ์ถœ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜ผ๋ž€์ด ๋‚˜ํƒ€๋‚˜๋Š” ์ง€์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์ด ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ alpha ๋ฅผ ์ถœ์‹œํ•˜์ง€ ์•Š๊ณ  RTM๋งŒ ์ถœ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ •ํ™•ํ•œ ETA๋Š” ์ œ ๋Šฅ๋ ฅ(์ €๋Š” ์—ฌ๊ฐ€ ์‹œ๊ฐ„์— ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค)๊ณผ ๋‹ค๋ฅธ ๊ธฐ์—ฌ์ž์˜ ๊ฐ€์šฉ์„ฑ(๋‚ด PR์„ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜‰)์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์ •ํ™•ํ•œ ETA๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ๋จธ๋ฆฌ๋กœ๋Š” ํ•œ ๋‘ ๋‹ฌ ์•ˆ์— ์ถœ์‹œ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•˜๊ณ  ์ด ๋ฒ”์œ„ ๋‚ด์—์„œ ์ผ์–ด๋‚˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ชจ๋ธ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์•ฝ 9๊ฐœ์›” ๋™์•ˆ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ง€์›์ด ์ง€์—ฐ๋˜๋Š” ์ฃผ๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋™์•ˆ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ”ผ๋“œ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ Nuget.config ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

#857์ด ์ตœ์ข…์ ์œผ๋กœ ๋ณ‘ํ•ฉ๋œ ํ›„ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ตœ์ข… .NET ํ˜ธํ™˜์„ฑ ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

| ์ œํ’ˆ | .NET ํ”„๋ ˆ์ž„์›Œํฌ | .NET ํ‘œ์ค€ |
| ------------------ | ------------------------ | ------------------------ |
| ์ž๋™ ๊ณ ์ • ์žฅ์น˜ | :heavy_check_mark: 4.5.2 | :heavy_check_mark: 1.5 |
| AutoFixture.xUnit | :heavy_check_mark: 4.5.2 | :heavy_minus_sign: |
| AutoFixture.xUnit2 | :heavy_check_mark: 4.5.2 | :heavy_check_mark: 1.5 |
| AutoFixture.NUnit2 | :heavy_check_mark: 4.5.2 | :heavy_minus_sign: |
| AutoFixture.NUnit3 | :heavy_check_mark: 4.5.2 | :heavy_check_mark: 1.5 |
| AutoFakeItEasy | :heavy_check_mark: 4.5.2 | :heavy_check_mark: 1.6 |
| ์˜คํ† ํฌํฌ | :heavy_check_mark: 4.5.2 | :heavy_minus_sign: |
| ์˜คํ† ๋ชจํฌ | :heavy_check_mark: 4.5.2 | :heavy_check_mark: 1.5 |
| ์ž๋™ ๋Œ€์ฒด | :heavy_check_mark: 4.5.2 | :heavy_check_mark: 1.5 |
| AutoRhinoMock | :heavy_check_mark: 4.5.2 | :heavy_minus_sign: |
| ๊ด€์šฉ๊ตฌ | :heavy_check_mark: 4.5.2 | :heavy_check_mark: 2.0 |
| Idioms.FsCheck | :heavy_check_mark: 4.5.2 | :heavy_minus_sign: |
| ์˜๋ฏธ ๋น„๊ต | :heavy_check_mark: 4.5.2 | :heavy_check_mark: 1.5 |

Idioms.FsCheck ์ œ์™ธํ•œ ๋ชจ๋“  ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ•ด๋‹น ์ข…์†์„ฑ์ด .Net Standard๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ณ  ์—…๋ฐ์ดํŠธ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์œผ๋ฏ€๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ). .NET 452 ๋ฐ .NET Standard 2.0 (๊ธฐ์ˆ ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•จ)๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Idioms.FsCheck ํฌํŠธ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. F# SDK๋Š” ์—ฌ์ „ํžˆ ๋งค์šฐ ๊ฑฐ์น ๊ณ  ์ƒˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. TargetFrameworks ๋…ธ๋“œ๋ฅผ ์ •์˜ํ•œ ํ›„ ์ปดํŒŒ์ผ ๋ฐ ํ”„๋กœ์ ํŠธ ๋กœ๋“œ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋น„์ „์ด ์—†๋Š” ํ•œ ์ €๋Š” ์ด ๊ณ„ํš์„ ๋”ฐ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜ƒ์ €๋„ ์ถœ์‹œ๊ฐ€ ์–ผ๋งˆ ๋‚จ์ง€ ์•Š์•˜๋Š”์ง€, ์–ผ๋งˆ๋‚˜ ๋’ค์ณ์ ธ ์žˆ๋Š”์ง€ ๋Š๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Š

๊ฐ€ ๊ฐ€ ๊ฐ€!

.NET 452 ๋ฐ .NET Standard 2.0 ๋ชจ๋‘ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Idioms.FsCheck ํฌํŠธ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ฒ„์ „์—์„œ ์ตœ์‹  F# ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? IIRC, F# 3.1์— ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ‹์ง„ ์ž‘ํ’ˆ @zvirja. ์šฐ๋ฆฌ๊ฐ€ v4๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ์„ค๋ ˆ๋Š” ๊ธฐ๋ถ„ :)

๋งฅ์ฃผ ํ•œ ์ž” ๋“œ๋ฆฌ๊ณ  ์‹ถ์–ด์š” :)

ํ•ด๋‹น ๋ฒ„์ „์—์„œ ์ตœ์‹  F# ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? IIRC, F# 3.1์— ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@moodmosaic ๋„ค. FsCheck 2.9.0 ์„ ํ™•์ธํ•˜๋ฉด FSharp.Core (>= 4.1.17) ์— ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ์„ ํƒ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜… ๋ฌธ์ œ๋Š” SDK์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋™์‹œ์— ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด VS์—์„œ ์†”๋ฃจ์…˜์„ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ:

<PropertyGroup>
  <TargetFrameworks>net452;netstandard2.0</TargetFrameworks>
  .....
</PropertyGroup>

<ItemGroup>
  <PackageReference Include="FsCheck" Version="[0.9.2,3.0.0)" Condition=" '$(TargetFramework)'=='net452' " />
  <PackageReference Include="FSharp.Core" Version="3.1.2" Condition=" '$(TargetFramework)'=='net452' " />

  <PackageReference Include="FsCheck" Version="[2.9.0,3.0.0)" Condition=" '$(TargetFramework)'=='netstandard2.0' " />
  <PackageReference Include="FSharp.Core" Version="4.1.17" Condition=" '$(TargetFramework)'=='netstandard2.0' " />

  <PackageReference Include="FSharp.NET.Sdk" Version="1.0.*" PrivateAssets="All" />
</ItemGroup>

VS์—์„œ ์—ด๋ ค๊ณ  ์‹œ๋„:
image

๋ชจ๋“  ๊ฒƒ์ด ํ”„๋กœ์ ํŠธ์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” F# SDK์˜ ์–ด๋”˜๊ฐ€์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— FsCheck์˜ .NET Core ์ง€์›์„ ๋” ๋‚˜์€ ์‹œ๊ธฐ๊นŒ์ง€ ์—ฐ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@Kralizek ์œ„์˜ ๋ช‡ ๊ฐ€์ง€ ๋‹ต๋ณ€์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

VS 2017.4์—์„œ ๋ฐฉ๊ธˆ ์ฒดํฌ์ธํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ F# ํ”„๋กœ์ ํŠธ์˜ ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด .NET Core๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ์ง€๊ธˆ์€ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

JFYI: NuGet์— v4 rc1์„ ์ถœ์‹œ ํ–ˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ํ”ผ๋“œ๋กœ ์žฌ์ƒํ•  ํ•„์š” ์—†์ด ์†Œ๋น„ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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