Autofixture: ๋Ÿฐํƒ€์ž„ `System.Type`์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋‚ด AutoMapper ๋งคํ•‘์ด ํญ๋ฐœํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

public class MapperTests
{
    private readonly IMapper _mapper; // from AutoMapper
    private readonly IFixture _fixture;

    public MapperTests()
    {
        _mapper = SetUpAutoMapper();
        _fixture = new Fixture();
    }

    [Theory]
    [InlineData(typeof(Foo), typeof(Bar))]
    [InlineData(typeof(Boo), typeof(Far))]
    // etc ...
    public void CanMapTypes(Type inputType, Type outputType)
    {
        var input = _fixture.Create(inputType);

        // throws exceptions if something's broken:
        _mapper.Map(input, outputType)
    }
}

๋‚œ ๊ทธ๋ƒฅ ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌ _fixture.Create(inputType) ์‹ค์ œ๋กœ ํ˜•์‹์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์˜ˆ : Foo ์ฒซ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ์—์„œ) ์‹ค์ œ๋กœ์˜ ์ธ์Šคํ„ด์Šค System.Type . ๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋‚ด ํ…Œ์ŠคํŠธ๋ฅผ ์ƒ๋‹นํžˆ ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•(IntelliSense ํƒ์ƒ‰)์„ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ๋‚ด ๊ธฐ๋Œ€์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์„ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ ๋Ÿฐํƒ€์ž„์— ์ œ๊ณต๋˜๋Š” ์œ ํ˜•์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

question

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

๊ฐ์‚ฌ ํ•ด์š”!

์ผ๋ฐ˜ fixture.Create<T>() ๊ฐœ์ฒด์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๊ฒฐ๊ตญ ์–ด๋””์— ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜์—ฌ ์ด๊ฒƒ์ด ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

var input = new SpecimenContext(_fixture).Resolve(sourceType);

๋‚˜๋Š” ๊ทธ๋“ค์ด ๋‹ค์†Œ ๋™๋“ฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :) ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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

๋ฌด์Šจ ์ผ์ธ์ง€ ์•Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

AutoFixture v4 ๋ฅผ ์‹œ๋„ํ•˜๋ฉด ์ด ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ํ˜ผ๋ž€์Šค๋Ÿฌ์šด Create() ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋“œ ๋ฅผ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ

```c#
_fixture.Create(์ž…๋ ฅ ์œ ํ˜•);

It might look that you are making a request of `typeof(Foo)` here, however in reality you are passing this argument as a `seed` and the actual request type is `typeof(Type)`.  To fix the issue please tune a bit your code:

```c#
public class Foo
{
}

[Theory]
[InlineData(typeof(Foo))]
public void TestTypeRequest(Type requestType)
{
    var fixture = new Fixture();
    var result = fixture.Create(requestType, new SpecimenContext(fixture));

    Assert.IsAssignableFrom<Foo>(result);
}

API๋Š” ๊ฐ„๊ฒฐํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š” ๐Ÿ˜‰

๊ฐ์‚ฌ ํ•ด์š”!

์ผ๋ฐ˜ fixture.Create<T>() ๊ฐœ์ฒด์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๊ฒฐ๊ตญ ์–ด๋””์— ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜์—ฌ ์ด๊ฒƒ์ด ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

var input = new SpecimenContext(_fixture).Resolve(sourceType);

๋‚˜๋Š” ๊ทธ๋“ค์ด ๋‹ค์†Œ ๋™๋“ฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :) ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@tlycken ์‹ค์ œ๋กœ ๋‘ ์Šค๋‹ˆํŽซ ๋ชจ๋‘ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ์˜ต์…˜์€ ํ›จ์”ฌ ๋” ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค :) ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค :blush:

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