Autofixture: ReadOnly๊ฐ€ ์•„๋‹Œ ์†์„ฑ์— ๋Œ€ํ•ด Readonly๋ฅผ ๋น„๋‚œํ•ฉ๋‹ˆ๋‹ค.

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

๋‚ด ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

public class Telefone : IEntity
{
    public virtual int Id { get; protected internal set; }
    public virtual string Tipo { get; set; }
    public virtual string Numero { get; set; }
}

์•„์ด๋””๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ณดํ˜ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Id๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๊ณ  ReadOnly์—ฌ์•ผ ํ•˜๋Š” ์˜๋„์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ํ…Œ์ŠคํŠธ ๊ณ„์ธต์—์„œ๋Š” ์ด ์†์„ฑ์˜ setter์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด์—์„œ AssemblyInfo.cs์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

[assembly: InternalsVisibleTo("MyTestLayer")]

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ…Œ์ŠคํŠธ ๋ ˆ์ด์–ด์—์„œ Id๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด์—์„œ๋Š” ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

ํ…Œ์ŠคํŠธ ๋ ˆ์ด์–ด์—์„œ
์ƒˆ๋กœ์šด Telefone().Id = 1; // ์ž‘๋™!!

UI ๋ ˆ์ด์–ด์—์„œ
์ƒˆ๋กœ์šด Telefone().Id = 1; // ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!

๋ฌธ์ œ

var pessoa = fix.Build<Pessoa>()
    .With(p => p.Nome)
    .Do((pess) =>
    {
        fix.Build<Telefone>()
            .With(p => p.Id)
            .With(p => p.Tipo)
            .With(p => p.Numero)
            .OmitAutoProperties()
            .CreateMany(10).ToList().ForEach(pess.Telefones.Add);

        fix.Build<Email>()
            .With(p => p.Id)
            .With(p => p.Tipo)
            .With(p => p.Endereco)
            .OmitAutoProperties()
            .CreateMany(10).ToList().ForEach(pess.Emails.Add);
    })
    .OmitAutoProperties()
    .Create();

์ด๋ก ์ ์œผ๋กœ ์œ„์˜ ์ฝ”๋“œ๋Š” ์ž‘๋™ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‚ด ๋„๋กœ ํ…Œ์ŠคํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด:

"Id" ์†์„ฑ์€ ์ฝ๊ธฐ ์ „์šฉ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ์†์„ฑ Id ์€ protected internal ์ž…๋‹ˆ๋‹ค.

๋™์ผํ•œ ํŒŒ์ผ์—์„œ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด Telefone().Id = 1; // ์ž‘๋™!!
์ƒˆ ์ด๋ฉ”์ผ().Id = 1; // ์ž‘๋™!!

question

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

์ด๊ฒƒ์€ ๋„๋ฉ”์ธ ๋ชจ๋ธ์— _๋ˆ„์„ค ์ถ”์ƒํ™”_๊ฐ€ ์žˆ์Œ์„ ๋ถ„๋ช…ํžˆ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ๋ชจ๋ธ์€ ํŠน์ • ๊ฒฝ๊ณ„ ๊ธฐ์ˆ ์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ด ํŠน์ • ๋ฌธ์ œ๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ _์—†๋‹ค๋Š” ๊ฒƒ์„ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

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

๊ฐ€์žฅ ์ข‹์€ ์กฐ์น˜๋Š” API ์„ค๊ณ„๋ฅผ ์žฌ๊ณ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

``` C#
๊ณต๊ฐœ ํด๋ž˜์Šค Telefone : IEntity
{
๊ณต์ค‘์ „ํ™”(int id)
{
this.Id = ์•„์ด๋””;
}

public virtual int Id { get; private set; }
public virtual string Tipo { get; set; }
public virtual string Numero { get; set; }

}
```

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋”ฐ๋ฅด๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ทธ๋ฃน์—์„œ ๋งŽ์€ ํ† ๋ก ์„ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค.
์ด ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์•„์ด๋”” ์ƒ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ์ฃผ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฉฐ, ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋  ๋•Œ๋งŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  2. ์ƒˆ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ์ƒ์„ฑ์ž์—์„œ ์–ด๋–ค Id๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? Id๋ฅผ ์ƒ์„ฑ์ž์— ๋„ฃ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  3. Id๋Š” int ์ˆœ์ฐจ์ž…๋‹ˆ๋‹ค. ์ €์žฅ์†Œ ๊ณ„์ธต์€ ๋„๋ฉ”์ธ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณ„์ธต์ž…๋‹ˆ๋‹ค. Id๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด max (id) + 1 ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ๋‚ด ๊ฐœ์ฒด์˜ Id๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฝ๊ธฐ ์ „์šฉ์ธ ๊ฒฝ์šฐ ID๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๊นŒ?
  4. ReadOnly ์†์„ฑ์—์„œ Id๋ฅผ ์„ค์ •ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ํด๋ž˜์Šค ์ž์ฒด ๋‚ด์—์„œ ๋˜๋Š” ํ”„๋ก์‹œ/๋ฐ˜์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด _๋ฌธ์ œ_๋ผ๋Š” ๋ฐ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ค ๊ฐ€์ง€ ๋ชจ๋‘ _strongly_ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์ง€์†์„ฑ ๊ณ„์ธต์— ์˜์กดํ•˜๋ฉฐ ๊ทธ๊ฒƒ ์—†์ด๋Š” ์ž‘๋™ํ•  ์ˆ˜ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ID๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์œ ์ผํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ID๊ฐ€ ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด GUID๊ฐ€ ์žˆ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.
  2. ์ƒˆ Guid ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  3. ID๊ฐ€ ์ˆœ์ฐจ์ ์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ID๊ฐ€ ์ˆœ์ฐจ์ ์ด์–ด์•ผ ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์ƒ์˜ ์ด์œ ๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.
  4. ๋™์˜. ์ ‘๊ทผ ํ•œ์ •์ž๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. PK ์œ ํ˜•์„ Guid๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์‹ค์ œ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋ฌธ์ œ๊ฐ€ AutoFixture์™€ ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด. ์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

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