Nunit: κΈ°λŠ₯μš”μ²­: PropertyConstraint에 μΈλ±μ„œ 지원 μΆ”κ°€

에 λ§Œλ“  2017λ…„ 06μ›” 02일  Β·  46μ½”λ©˜νŠΈ  Β·  좜처: nunit/nunit

ν˜„μž¬λ‘œμ„œλŠ” 일반 μ†μ„±μ˜ κ°’λ§Œ ν…ŒμŠ€νŠΈν•  수 있으며 μΈλ±μ„œ 값을 ν…ŒμŠ€νŠΈν•  방법은 μ—†μŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

```c#
[ν…ŒμŠ€νŠΈν”½μŠ€μ²˜]
곡개 클래슀 ν…ŒμŠ€νŠΈ 클래슀
{
클래슀 예
{
개인 사전사전 = μƒˆ 사전();

  public string this[string key]
  {
    get { return dictionary[key]; }
    set { dictionary[key] = value; }
  }
}

[Test]
public void Test()
{
  var obj = new Example
  {
    ["TEST1"] = "1",
    ["TEST2"] = "2",
  };

  Assert.That(obj, Has.Property("Item", "TEST1").EqualTo("1").And.Property("Item", "TEST2").EqualTo("2"));
}

}
```

done help wanted enhancement normal

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

그리고 κΈ‰λ£ŒλŠ” μ—¬κΈ° μžˆλŠ” λͺ¨λ“  뢄듀이 NUnitμ—μ„œ μΌν•˜λ©΄μ„œ 0λ‹¬λŸ¬ μ •λ„μ˜ 연봉을 λ°›κ³  있기 λ•Œλ¬Έμ— λͺ¨λ‘ 같은 κΈ‰λ£ŒλΌκ³  μƒκ°ν•©λ‹ˆλ‹€ 😝

λͺ¨λ“  46 λŒ“κΈ€

아이디어가 λ§ˆμŒμ— λ“­λ‹ˆλ‹€.

C#은 λͺ…λͺ…λœ μΈλ±μ‹±λœ 속성을 μ§€μ›ν•˜μ§€ μ•Šμ§€λ§Œ VB.NET은 μ§€μ›ν•©λ‹ˆλ‹€. .Property("Name", index1, ...) ꡬ문은 λͺ…λͺ…λœ μΈλ±μ„œμš©μœΌλ‘œ μ˜ˆμ•½λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ κΈ°λ³Έ μΈλ±μ„œμ— μ‚¬μš©λ˜λŠ” 것을 보고 싢지 μ•ŠμŠ΅λ‹ˆλ‹€. μ‚¬λžŒλ“€μ΄ 이름 λ§€κ°œλ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜λ„λ‘ μš”κ΅¬ν•˜μ§€ μ•ŠμŒμœΌλ‘œμ¨ C# μ–Έμ–΄λ₯Ό 쑴쀑할 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€.

Has.Item("TEST1").EqualTo("1") λ˜λŠ” Has.Index("TEST1").EqualTo("1") μ–΄λ–»κ²Œ μƒκ°ν•˜μ„Έμš”?

@jnm2
"Item" λ˜λŠ” "Indexer" λ©”μ„œλ“œλ₯Ό λ°”λ‘œ κ°€κΈ°λ‘œ μ‚¬μš©ν•˜λ©΄ νŽΈλ¦¬ν•˜μ§€λ§Œ μ‹€μ œλ‘œ C#μ—μ„œ μΈλ±μ„œ 이름을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. https://stackoverflow.com/questions/5110403/class-with-indexer-and-property-named -μ•ˆκ±΄

@Ch0senOne 이름 변경이 κ°€λŠ₯ν•©λ‹ˆλ‹€. λΆ„λͺ…νžˆ λ§ν–ˆμ–΄μ•Ό ν–ˆλŠ”λ° C#μ—μ„œ 기본이 μ•„λ‹Œ μΈλ±μ„œλ₯Ό λ§Œλ“œλŠ” 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 두 개의 μΈλ±μ„œλ₯Ό μ„ μ–Έν•  수 μ—†μœΌλ©° C#의 이름을 μ‚¬μš©ν•  μˆ˜λ„ μ—†μŠ΅λ‹ˆλ‹€.
생각해 보면 Has.Item("value") κ°€ Contains.Item 와 λ„ˆλ¬΄ ν˜Όλ™λ  것 κ°™μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ•„λ§ˆλ„ Has.Index("value") ?

λ”°λΌμ„œ κΈ°λ³Έ μΈλ±μ„œμ—λŠ” Has.Index("IndexValue") λ₯Ό, 기본이 μ•„λ‹Œ μΈλ±μ„œλŠ” Has.Property("PropertyName", indexParams) λ₯Ό μ„ ν˜Έν•©λ‹ˆλ‹€. Has.Property λŠ” κ΄€μš©μ μΈ C# μž‘μ—…μ΄ Has.Index λ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ κΈ°λ³Έ μΈλ±μ„œμ—μ„œλ„ μž‘λ™ν•˜κ²Œ λ©λ‹ˆλ‹€.


λ˜λŠ” μš°λ¦¬κ°€ κ·€μ—½κ³  μ‹Άλ‹€λ©΄ Has.Index["IndexValue"] 있고
Has.Property("PropertyName")[indexparams] ... 😁

사싀, Contains.Item("ItemValue") 와 ν˜Όλ™λ˜λŠ” 것을 ν”Όν•˜κΈ° μœ„ν•΄ μΈλ±μ„œ ꡬ문을 μ‚¬μš©ν•˜μ—¬ Has.Item["AtIndex"] μ‚¬μš©ν•  수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€... 그것에 λŒ€ν•΄ μ–΄λ–»κ²Œ μƒκ°ν•˜λŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€!


λ‹€λ₯Έ @nunit/framework-team 멀버듀은 μ–΄λ–»κ²Œ μƒκ°ν•˜λŠ”μ§€ λ΄…μ‹œλ‹€.

μš°λ¦¬λŠ” 이미 λ¬Έμžμ—΄μ΄ μ•„λ‹Œ λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜μ—¬ 속성에 λŒ€ν•œ λ°©ν–₯을 μ •μ˜ν–ˆμŠ΅λ‹ˆλ‹€. μ‹œκ°„μ„ λ³΄λ‚΄λŠ” 것이 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€. μ œκ°€ μ „ν™”λ₯Ό ν•˜κ³  μžˆμ–΄μ„œ 문제 번호λ₯Ό μ•Œλ €λ“œλ¦΄ 수 μ—†μŠ΅λ‹ˆλ‹€.

@CharliePoole https://github.com/nunit/nunit/issues/26?

그것은 Has.Property μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • Has.Property(_ => _.PropertyName[index1, ...])
  • Has.Property(_ => _.PropertyName, index1, ...)

기본이 μ•„λ‹Œ 속성이 ν•„μš”ν•  λ•ŒκΉŒμ§€ Has.Property 아무 것도 ν•΄μ„œλŠ” μ•ˆ λœλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ§€κΈˆμ€ Has.Index(value1, ...) λ˜λŠ” Has.Index[value1, ...] λ˜λŠ” Has.Item[value1, ...] ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€. 훨씬 더 일반적인 κΈ°λ³Έ μΈλ±μ„œ.

λ°”λ‘œ κ·Έ μ‚¬λžŒμž…λ‹ˆλ‹€. μ–΄μ¨Œλ“  μš”μ²­λ˜μ§€ μ•Šμ€ λͺ…λͺ…λœ μΈλ±μ„œμ— λŒ€ν•΄ λ™μ˜ν•©λ‹ˆλ‹€.

@jnm2 닀쀑 ν‚€ μΈλ±μ„œλ₯Ό λ§Œλ“€ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄

this[string key1, string key2]

이 λ¬Έμ œμ— λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆλŠ”μ§€ λ˜λŠ” IEnumerable을 μƒμ†ν•˜μ§€ μ•ŠλŠ” ν˜•μ‹μ—μ„œ μΈλ±μ„œλ₯Ό ν…ŒμŠ€νŠΈν•˜λŠ” ν˜„μž¬ 방법이 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. KeyNotFoundException이 λ°œμƒν•˜λŠ”μ§€ 확인할 수 μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. μΈλ±μ„œμ— ν‚€κ°€ μžˆλŠ”μ§€ 확인할 수 μžˆλ„λ‘ κ°„κ³Όν•˜κ³  μžˆλŠ” λ‹€λ₯Έ 사항이 μžˆμŠ΅λ‹ˆκΉŒ?

@crush83 예, 제 index1, ... ꡬ문은 μš°λ¦¬κ°€ 무엇을 ν•˜λ“  그것듀을 κ³ λ €ν•΄μ•Ό ν•œλ‹€λŠ” 것을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” μš°λ¦¬κ°€ μ‹€μ œλ‘œ μ‚¬μ „μ΄λ‚˜ ν‚€ λͺ¨μŒμΈ 객체에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜μ§€ μ•ŠλŠ” ν•œ μš©μ–΄ ν‚€λ₯Ό μ’‹μ•„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” κΈ°λ³Έ μΈλ±μ„œκ°€ μžˆλŠ” ν•­λͺ©μ΄μ§€λ§Œ κΈ°λ³Έ μΈλ±μ„œκ°€ μžˆλŠ” λͺ¨λ“  ν•­λͺ©μ— ν‚€κ°€ μžˆλŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. (이 μš©μ–΄λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμœΌλ―€λ‘œ Contains.Key ꡬ문이 도움이 될 수 μžˆμŠ΅λ‹ˆκΉŒ? κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?)

μ—¬κΈ° λ³΄μ΄λŠ” 것 μ™Έμ—λŠ” 진전이 μ—†μŠ΅λ‹ˆλ‹€. μ œμ•ˆμ΄ ν•„μš”ν•©λ‹ˆλ‹€. 거기에 무언가λ₯Ό μΆ”κ°€ν•˜κΈ° μœ„ν•΄ ν˜„μž¬ κ°€μž₯ μ’‹μ•„ν•˜λŠ” 것은 이름이 무엇이든 κΈ°λ³Έ μΈλ±μ„œλ₯Ό ν˜ΈμΆœν•˜λŠ” Has.Item(params object[] indexerArgs) μž…λ‹ˆλ‹€.
μ΄λ ‡κ²Œ ν•˜λ©΄ μ§€κΈˆκΉŒμ§€ μš”μ²­λœ λͺ¨λ“  μž‘μ—…μ΄ μˆ˜ν–‰λ©λ‹ˆκΉŒ?

+1

@nunit/framework-team λ‹€μŒ μƒˆ APIλ₯Ό μ§€μ›ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

namespace NUnit.Framework
{
    public abstract class Has
    {
        public static ResolvableConstraintExpression Property(string name);

+       public static ResolvableConstraintExpression Item(params object[] indexerArgs);
    }
}

namespace NUnit.Framework.Constraints
{
    public class ConstraintExpression
    {
        public ResolvableConstraintExpression Property(string name);

+       public ResolvableConstraintExpression Item(params object[] indexerArgs);
    }
}

API에 μΆ”κ°€ν•  μ΄μœ κ°€ μžˆμ„ λ•ŒκΉŒμ§€ IndexerConstraint 클래슀λ₯Ό 내뢀에 λ‚¨κ²¨λ‘κ² μŠ΅λ‹ˆλ‹€.

λ‚˜μ—κ²Œ 쒋은 μ†Œλ¦¬.

또 λ‹€λ₯Έ μ°¬μ„±μœΌλ‘œ μ €λŠ” μ½˜μ†” ν…ŒμŠ€νŠΈμš©μœΌλ‘œ 이 κΈ°λŠ₯을 μ›ν–ˆμŠ΅λ‹ˆλ‹€. πŸ™‚

@jnm2 이 λ¬Έμ œκ°€ μ—¬μ „νžˆ νŒ€μ—μ„œ μ›ν•˜λŠ” μž‘μ—…μΈκ°€μš”?

λ‚˜λŠ” 이 λ¬Έμ œμ— λŒ€ν•œ λΉ λ₯Έ μ§ˆλ¬Έμ„ λ°›μ•˜κ³  μ§€μ›λ˜λŠ” APIκ°€ λ‹€μŒκ³Ό κ°™μ•„μ•Ό ν•˜λŠ”μ§€ μ •ν™•νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ— λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

/// obj from the initial post example
Assert.That(obj, Has.Item("TEST1").EqualTo(1).And.Item("TEST2").EqualTo(2));

λ˜λŠ” 그것은:

Assert.That(obj, Has.Item("TEST1", 1).And.Item("TEST2", 2));

?

μ˜ˆλŠ” params object[] ν•˜λ―€λ‘œ μ˜΅μ…˜ 2둜 μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

κ°€μ •ν•˜κ³  μ„ νƒν•©λ‹ˆλ‹€. 2, ν•˜λ‚˜μ˜ 객체만 제곡된 κ²ƒμ²˜λŸΌ 배열이 ν•„μš”ν•©λ‹ˆκΉŒ, ν‚€κ°€ μ‘΄μž¬ν•˜λŠ”μ§€, 2개의 λ§€κ°œλ³€μˆ˜(킀와 κ°’)κ°€ μžˆλ‹€κ³  μ£Όμž₯ν•©λ‹ˆκΉŒ? λ‹€λ₯Έ μ‘°ν•©(보닀 λ§Žκ±°λ‚˜ 적은 μ˜ˆμƒ λ§€κ°œλ³€μˆ˜), μ‹€νŒ¨?

@Poimen λ„€, 도움을 μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€!

μΈλ±μ„œλŠ” λ‘˜ μ΄μƒμ˜ 인수λ₯Ό μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ 배열이 ν•„μš”ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄:

public string this[int x] => "First indexer";

public string this[string x] => "Second indexer";

public string this[int x, int y] => "Third indexer";

Has.Item(42).EqualTo("First indexer") , Has.Item("42").EqualTo("Second indexer") 및 Has.Item(1, 2).EqualTo("Third indexer") ν•©λ‹ˆλ‹€.

λ³΄μ„Έμš”, 당신은 맀일 μƒˆλ‘œμš΄ 것을 λ°°μ›λ‹ˆλ‹€ - λ‚˜λŠ” 그것이 μ˜€νƒ€λΌκ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€, oops :see_no_evil: μ „μ—λŠ” 닀쀑 ν‚€ μΈλ±μ„œλ₯Ό μ‚¬μš©ν•˜λŠ” 즐거움을 느껴본 적이 μ—†μ—ˆμŠ΅λ‹ˆλ‹€...

μ•Œκ² μŠ΅λ‹ˆλ‹€. 이번 주에 정리할 λ‚΄μš©μ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

@jnm2 이 λ¬Έμ œμ— λŒ€ν•œ PR을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ 가진 ν•œ 가지 μš°λ €λŠ” μ½”λ“œμ—μ„œ μƒμ„±λ˜λŠ” 였λ₯˜ λ©”μ‹œμ§€μž…λ‹ˆλ‹€.

Has.Item(42)

였λ₯˜ λ©”μ‹œμ§€λŠ” μ•½κ°„ "ν•΄ν‚€"μ΄μ§€λ§Œ 이것을 ν•΄κ²°ν•˜λŠ” κ°€μž₯ κΉ¨λ—ν•œ 방법이 무엇인지 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. "ν•΄ν‚Ή"은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
https://github.com/nunit/nunit/pull/3609/commits/96154ca6402c692cec5e0ae6947f9922e72799fe#diff -ceeee4b8399633f181b6bccd5a39eb32R72

@Poimen μ£„μ†‘ν•©λ‹ˆλ‹€. 무슨 말인지 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. ν˜„μž¬ λ©”μ‹œμ§€λŠ” 무엇이며 무엇을 μ›ν•˜μ‹­λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ μ œμ•ˆμ„ μ°Ύκ³  κ³„μ‹­λ‹ˆκΉŒ?

@jnm2 λ‚˜νƒ€λ‚˜λŠ” 였λ₯˜ λ©”μ‹œμ§€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  Expected: indexer [System.Int32]
  But was:  "not found"

였λ₯˜ λ©”μ‹œμ§€κ°€ ν˜•μ„±λ˜λŠ” 방식 StringifyArguments ν•¨μˆ˜λŠ” μ•½κ°„ "ν•΄ν‚€"μž…λ‹ˆλ‹€.

λ”°λΌμ„œ λ‚΄κ°€ 잘λͺ» ν‘œν˜„ν•œ μ§ˆλ¬Έμ€ μ›ν•˜λŠ” λ©”μ‹œμ§€ 좜λ ₯을 μƒμ„±ν•˜λŠ” 더 κΉ¨λ—ν•œ 방법이 μžˆλ‹€λ©΄ 더 λ§ŽμŠ΅λ‹ˆλ‹€.

@jnm2 리뷰에 λŒ€ν•œ μ˜κ²¬μ„ μ²˜λ¦¬ν–ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€(κ°μ‚¬ν•©λ‹ˆλ‹€). λ ˆμ΄λΈ”μ— awaiting:contributor μžˆμŠ΅λ‹ˆλ‹€.

"μ™„λ£Œ"λ˜μ—ˆμŒμ„ μ•Œλ¦¬κΈ° μœ„ν•΄ 더 ν•΄μ•Ό ν•  일이 μžˆλŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. +1:

Has.Property 이 속성을 찾을 수 없을 λ•Œ ν‘œμ‹œλ˜λŠ” λ©”μ‹œμ§€μ— μ΅œλŒ€ν•œ κ°€κΉκ²Œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ property λ₯Ό default indexer 둜 λ°”κΎΈκ³  속성 이름을 accepting arguments [42] λ˜λŠ” 이와 μœ μ‚¬ν•œ κ²ƒμœΌλ‘œ λ°”κΏ”μ•Ό ν•©λ‹ˆλ‹€. 인수 μœ ν˜•μ„ λ‚˜μ—΄ν•˜λŠ” λŒ€μ‹  인수 값을 ν‘œμ‹œν•˜κΈ° μœ„ν•΄ MsgUtils.FormatCollection 와 같은 κΈ°μ‘΄ ν˜•μ‹ 지정 λ„μš°λ―Έ 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 인수 쀑 ν•˜λ‚˜κ°€ null이고 λ‹€μ–‘ν•œ μœ ν˜•μ—μ„œ μž‘λ™ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λ‹ˆμ˜€, ν›Œλ₯­ν•©λ‹ˆλ‹€! PR μŠ€λ ˆλ“œ μžμ²΄μ— 그런 μ½”λ©˜νŠΈκ°€ 이상적일 κ²ƒμž…λ‹ˆλ‹€.

μ£Όμž₯을 κ°μ•ˆν•  λ•Œ :
```c#
Assert.That(ν…ŒμŠ€ν„°, Has.Item("μ™€μš°"));


It producers the message:

μ˜ˆμƒ: 인수λ₯Ό ν—ˆμš©ν•˜λŠ” κΈ°λ³Έ μΈλ±μ„œ <>
κ·ΈλŸ¬λ‚˜ "찾을 수 μ—†μŒ"


Given the assertion:
```c#
Assert.That(tester, Has.Item("wow").EqualTo(1));

λ‹€μŒκ³Ό 같은 λ©”μ‹œμ§€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

Default indexer accepting arguments < "wow" > was not found on NUnit.Framework.Constraints.IndexerConstraintTests+NamedIndexTester.

이것은 MsgUtils.FormatCollection ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ μΆ”κ°€λœ μ„ΈλΆ€ 정보와 ν•¨κ»˜ 속성 λ©”μ‹œμ§€μ™€ 더 λ°€μ ‘ν•˜κ²Œ μΌμΉ˜ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 두 번째 경우λ₯Ό 맀우 μ’‹μ•„ν•œλ‹€. 첫 번째 κ²½μš°λŠ” 인수 κ°’ λŒ€μ‹  인수 μœ ν˜•μ„ ν‘œμ‹œν•˜κΈ° λ•Œλ¬Έμ— μ—¬μ „νžˆ μ˜λ―Έμƒ 잘λͺ»λœ 것 κ°™μŠ΅λ‹ˆλ‹€. 인수 κ°’λ§Œ 있으며 각 인수 값은 μΈλ±μ„œμ˜ 인수 μœ ν˜• λ²”μœ„μ™€ μΌμΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. IEnumerable<char> μΈμˆ˜λ„ λ§ˆμ°¬κ°€μ§€λ‘œ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ— System.String μΈμˆ˜κ°€ μžˆλŠ” μΈλ±μ„œκ°€ μžˆλŠ” κ²ƒμ²˜λŸΌ 보이게 ν•˜λŠ” 것은 잘λͺ»λœ κ²ƒμž…λ‹ˆλ‹€.

IEnumerable<char> λŠ” μ—‰λš±ν•œ μ‚¬μš© μ‚¬λ‘€μž…λ‹ˆλ‹€...ν•˜μ§€λ§Œ ν™•μ‹€νžˆ μš”μ μ€ μ•Œκ² μŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ, λ‹€μ‹œ 주어진:
```c#
Assert.That(ν…ŒμŠ€ν„°, Has.Item("μ™€μš°"));


producers the message:

μ˜ˆμƒ: 인수λ₯Ό ν—ˆμš©ν•˜λŠ” κΈ°λ³Έ μΈλ±μ„œ < "wow" >
κ·ΈλŸ¬λ‚˜ "찾을 수 μ—†μŒ"


For numbers it goes into the usual suffix - given:
```c#
Assert.That(tester, Has.Item(42d));

μƒμ‚°μž:

  Expected: Default indexer accepting arguments < 42.0d >
  But was:  "not found"

그러면 'μ˜ˆμƒ' λ©”μ‹œμ§€κ°€ λ©‹μ§€κ²Œ λ³΄μž…λ‹ˆλ‹€. But was: "not found" λ©”μ‹œμ§€λŠ” λ‚΄μš©μ΄ not found 인 λ¬Έμžμ—΄ μΈμŠ€ν„΄μŠ€μ— λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ PropertyConstraintκ°€ λ™μΌν•œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ©΄ λ™μΌν•œ λ°©μ‹μœΌλ‘œ μœ μ§€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. PropertyConstraintλ₯Ό λ³€κ²½ν•˜λŠ” 것은 기본적으둜 이 PR의 λ²”μœ„λ₯Ό λ²—μ–΄λ‚©λ‹ˆλ‹€. 당신이 μ›ν•œλ‹€λ©΄ μš°λ¦¬λŠ” μ—¬μ „νžˆ λ³€κ²½ν•  수 있고 λ‚˜μ™€ ν”„λ ˆμž„μ›Œν¬ νŒ€μ˜ λ‹€λ₯Έ λˆ„κ΅°κ°€κ°€ 변경을 μŠΉμΈν–ˆμŠ΅λ‹ˆλ‹€.

예, μ΄λ ‡κ²Œ ν•˜μ§€ μ•Šλ„λ‘ ν•˜λ €κ³  ν–ˆμ§€λ§Œ 였λ₯˜ λ©”μ‹œμ§€μ™€ ν•¨κ»˜ ν•΄κ²° 방법을 찾을 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그것이 단지 λ‹€μŒκ³Ό κ°™μœΌλ©΄ μ’‹μ•˜μ„ κ²ƒμž…λ‹ˆλ‹€.

But was: not found

κ·ΈλŸ¬λ‚˜ ConstraintResult 의 λ°˜ν™˜μ€ 거기에 λ¬Έμžμ—΄ λ”°μ˜΄ν‘œλ₯Ό λ„£λŠ” κ²ƒμž…λ‹ˆλ‹€.

참고둜 속성 버전:
```c#
Assert.That(ν…ŒμŠ€ν„°, Has.Property("NoItDoesNotHaveThis"));

produces:

μ˜ˆμƒ: 속성 NoItDoesNotHaveThis
ν•˜μ§€λ§Œ λ‹€μŒκ³Ό κ°™μ•˜μŠ΅λ‹ˆλ‹€.
```
λ”°λΌμ„œ λ”°μ˜΄ν‘œλŠ” μ—†μ§€λ§Œ 값이 μ•„λ‹Œ μœ ν˜•μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.

ConstraintResult 의 μ˜€λ²„λ‘œλ“œλ₯Ό λ°˜ν™˜ν•˜λŠ” 것이 해결책인지 ν™•μ‹ ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

일관성을 μœ„ν•΄ PropertyConstraintκ°€ ν•˜λŠ” 일을 κ³ μˆ˜ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. actual 값이 무엇인지에 λŒ€ν•œ κΈ°λ³Έ ν‘œν˜„μ„ ν‘œμ‹œν•˜λŠ” 것은 μ‹€νŒ¨ν•œ 것이 속성을 μ°ΎλŠ” μ€‘μ΄λΌλŠ” λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ  λ•Œ μ΅œμ•…μ˜ 상황이 μ•„λ‹™λ‹ˆλ‹€.

ConstraintResultμ—μ„œ νŒŒμƒλœ μƒˆ 클래슀λ₯Ό λ°˜ν™˜ν•˜λŠ” 것은 λ‹€λ₯Έ μ œμ•½ 쑰건이 이λ₯Ό μ‚¬μš©μž μ •μ˜ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

μ’‹μ•„, μ’‹μ•„ - λ‹€μŒκ³Ό 같이 λ“€λ¦°λ‹€.
```c#
Assert.That(ν…ŒμŠ€ν„°, Has.Item(42d));


producers:

μ˜ˆμƒ: 인수λ₯Ό ν—ˆμš©ν•˜λŠ” κΈ°λ³Έ μΈλ±μ„œ < 42.0d >
ν•˜μ§€λ§Œ λ‹€μŒκ³Ό κ°™μ•˜μŠ΅λ‹ˆλ‹€.
```

μ΄λŠ” 속성 μ œμ•½ 쑰건 λ©”μ‹œμ§€μ™€ μΌμΉ˜ν•©λ‹ˆλ‹€.

@nunit/framework-team 및 μ—¬λŸ¬λΆ„, @Poimen 의 μš°μˆ˜ν•œ PR(https://github.com/nunit/nunit/pull/3609)이 λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ 병합될 μ€€λΉ„κ°€ λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이 μ§ˆλ¬Έμ— λŒ€ν•œ λΉ λ₯Έ 해결을 λ°”λžλ‹ˆλ‹€.

λ‚΄ 관심을 끌게 @Dreamescaper 이 μŠ€λ ˆλ“œμ—μ„œ λ‚΄ 관심 λ†’μ€κΉŒμ§€ λ‚΄κ°€ 좔적을 μžƒμ—ˆλ‹€ : λ‚˜λŠ” λ‘λ €μ›Œ μ‚¬λžŒλ“€μ€ λͺ¨λ‘ κΈ°λ‘λ©λ‹ˆλ‹€ ν•΄μš” 읽기 Assert.That(collection, Has.Item("x")); 생각이 Has.Item μˆ˜λ‹¨μ„ Contains.Item .
μ‹€νŒ¨ λ©”μ‹œμ§€μ— 무언가λ₯Ό μΆ”κ°€ν•˜λŠ” 것을 κ³ λ €ν•  수 μžˆμ§€λ§Œ μ†ŒμŠ€ μ½”λ“œμ—μ„œ Has.Item λ₯Ό 읽을 λ•Œ μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•˜λŠ” 데 도움이 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  Expected: Default indexer accepting arguments < 42.0d > (Did you mean to use Contains.Item?)

λ°˜λ©΄μ— Item λŒ€μ‹  μ œμ•ˆν•œ Has.Index(42) λ˜λŠ” Has.Index(42).EqualTo(43) κ°€ λ§ˆμŒμ— 듀지 μ•ŠμŠ΅λ‹ˆλ‹€. μΈμŠ€ν„΄μŠ€λŠ” μΈλ±μŠ€μ— ν•­λͺ©μ΄ μžˆμŠ΅λ‹ˆλ‹€. 당신은 μΈμŠ€ν„΄μŠ€κ°€ μΈλ±μŠ€κ°€ 인덱슀 μžμ²΄κ°€ 43 κ°™λ‹€λŠ” 것을 μ§€μˆ˜λŠ” 42둜 전달 일 μ–ΈκΈ‰ν•˜μ§€ μ•Šμ•˜λ‹€.

일뢀 μ˜΅μ…˜

  • Has.Item ν•©λ‹ˆλ‹€. μ†ŒμŠ€ μ½”λ“œλ₯Ό 읽을 λ•Œ λ°œμƒν•  수 μžˆλŠ” 문제λ₯Ό ν¬κΈ°ν•˜μ‹­μ‹œμ˜€. XML λ¬Έμ„œ 및 μ‹€νŒ¨ λ©”μ‹œμ§€μ˜ 팁과 같이 μ†ŒμŠ€ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ 도움이 λ˜λ„λ‘ λͺ‡ 가지 μ™„ν™”λ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μš©μ–΄μ˜ μ–΄μƒ‰ν•œ ν˜Όν•©μ—λ„ λΆˆκ΅¬ν•˜κ³  Has.Index λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • λŒ€μ‹  Has.ItemAt μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. Has.ItemAt(42).EqualTo(43) .

μž κΉλ§Œμš”. λ§ˆμ§€λ§‰ μ œμ•ˆμ€ μΈλ±μŠ€κ°€ 제곡되고 ν•­λͺ©μ„ λ°˜ν™˜ν•˜λŠ” LINQ ElementAt λ©”μ„œλ“œμ™€ μœ μ‚¬ν•˜κΈ° λ•Œλ¬Έμ— 방금 λ§ˆμ§€λ§‰ μ œμ•ˆκ³Ό μ‚¬λž‘μ— λΉ μ‘ŒμŠ΅λ‹ˆλ‹€.

λͺ¨λ‘ Has.ItemAt ν•˜μ‹­λ‹ˆκΉŒ? μ œμ•ˆμ„ ν™˜μ˜ν•˜μ§€λ§Œ @Poimen 이 이미 ν—Œμ‹ ν•œ μ‹œκ°„μ„

Has.ItemAt +1 :)

Has.Item 이 잠재적으둜 ν˜Όλ™μ„ 쀄 수 μžˆλ‹€λŠ” 점에 λ™μ˜ν•©λ‹ˆλ‹€. λ‚˜λŠ” Has.ItemAt λ₯Ό μ’‹μ•„ν•˜μ§€λ§Œ LINQ ꡬ문을 μ’‹μ•„ν•˜κΈ° λ•Œλ¬Έμ— Has.ElementAt μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

ElementAtλŠ” 직접적인 동등물이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄ Dictionary<string,string> LINQ의 ElementAt(0)은 첫 번째 μŒμ„ λ°˜ν™˜ν•˜κ³  Has.ItemTo(0).EqualTo("...")λŠ” μ •μˆ˜λ₯Ό ν—ˆμš©ν•˜λŠ” μΈλ±μ„œκ°€ μ—†κΈ° λ•Œλ¬Έμ— μ‹€νŒ¨ν•©λ‹ˆλ‹€.

@CharliePoole 정말 쒋은 μƒκ°μž…λ‹ˆλ‹€. μ°ΎκΈ°κ°€ 직관적이지 μ•Šμ„ 것 κ°™μ§€λ§Œ μ™œ κ·Έλ ‡κ²Œ μƒκ°ν•˜λŠ”μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. Item μ„ ν˜Έν•˜λŠ” μ΄μœ λŠ” μ•„λ§ˆλ„ μΌμ’…μ˜ μ»¬λ ‰μ…˜/사전/μ‘°νšŒμ— λŒ€ν•΄ μΈλ±μ„œλ₯Ό ν˜ΈμΆœν•˜λŠ” 반면 ElementAt λŠ” 쿼리 및 λ°˜λ“œμ‹œ μ»¬λ ‰μ…˜μ΄ μ•„λ‹Œ 기타 μ—΄κ±°ν˜•μ—μ„œ μž‘λ™ν•˜κΈ° μœ„ν•œ 것이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. . μ»¬λ ‰μ…˜ μš”μ†ŒλŠ” 일반적으둜 ν•­λͺ©μ΄λΌκ³  ν•©λ‹ˆλ‹€.

@Dreamescaper Has.ItemAt(4) κ°€ ElementAt 처럼 μΈλ±μ„œλ₯Ό ν˜ΈμΆœν•˜λŠ” λŒ€μ‹  μ—΄κ±°ν•˜λŠ” κ²ƒμ²˜λŸΌ μž‘λ™ν•œλ‹€κ³  μƒκ°ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ?

@jnm2
μ•„λ§ˆλ„ 그럴 수 μžˆμ§€λ§Œ 더 λ‚˜μ€ μ˜΅μ…˜μ„ μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€ (그리고 μ—¬μ „νžˆ Has.Item보닀 훨씬 더 λ‚˜μ€ μ˜΅μ…˜μ΄λΌκ³  μƒκ°ν•©λ‹ˆλ‹€).

@jnm2 사싀 쑰금 ν—·κ°ˆλ¦½λ‹ˆλ‹€. 이 λ¬Έμ œλŠ” 속성에 λŒ€ν•œ κ²ƒμœΌλ‘œ μ‹œμž‘ν–ˆμœΌλ©° μ—¬μ „νžˆ 제λͺ©μ΄ κ·ΈλŒ€λ‘œμž…λ‹ˆλ‹€. Has.Property와 Has.ItemAtλŠ” μ‚¬μš©μžμ˜ κ΄€μ μ—μ„œ μ„œλ‘œ μ–΄λ–»κ²Œ κ΄€λ ¨λ˜κ±°λ‚˜ μƒν˜Έ μž‘μš©ν•˜κ±°λ‚˜ 비ꡐ할 κ²ƒμž…λ‹ˆκΉŒ?

[속성과 μ»¬λ ‰μ…˜ ν•­λͺ©μ΄ νŠΉμ • μˆ˜μ€€μ˜ μΆ”μƒν™”μ—μ„œ λ™λ“±ν•˜κ²Œ 취급될 수 μžˆλ‹€λŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ 이것이 우리 λŒ€λΆ€λΆ„μ΄ 일반적으둜 μž‘λ™ν•˜λŠ” 좔상화 μˆ˜μ€€μ€ μ•„λ‹ˆλΌκ³  μƒκ°ν•©λ‹ˆλ‹€. :smileing_imp: ]

NUnit 4.0의 경우 APIμ—μ„œ μš©μ–΄κ°€ μ‚¬μš©λ˜λŠ” 방식을 μ‚΄νŽ΄λ³΄κ³  μ•½κ°„ μ •λ¦¬ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. "멀버"λΌλŠ” λ‹¨μ–΄λŠ” μ’…μ’… "ν•­λͺ©"κ³Ό λ™μΌν•˜κ²Œ μ‚¬μš©λ˜μ§€λ§Œ 속성, λ©”μ„œλ“œ λ˜λŠ” λ³€μˆ˜λ₯Ό μ˜λ―Έν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λΆ€λΆ„μ μœΌλ‘œ Enumerable.ElementAt μœ„μž„ν•˜κ±°λ‚˜ λ™μΌν•œ νŠΉμ • μ ‘κ·Ό 방식을 μ·¨ν•˜λŠ” κ²ƒμ²˜λŸΌ 보일 수 있기 λ•Œλ¬Έμ— ItemAt over ElementAt κ°€μž₯ νŽΈμ•ˆν•©λ‹ˆλ‹€. ElementAt(int index) μ—μ„œ λ‚˜λ₯Ό κ°•ν•˜κ²Œ λ†€λΌκ²Œ ν•œ 것은 μž‘λ™ 방식에 λŒ€ν•œ μ„ΈλΆ€ μ‚¬ν•­λ³΄λ‹€λŠ” 특히 index λΌλŠ” 맀개 λ³€μˆ˜μ™€ κ΄€λ ¨λœ BCL에 At 접미사에 λŒ€ν•œ μ„ λ‘€κ°€ μžˆλ‹€λŠ” μ‚¬μ‹€μ΄μ—ˆμŠ΅λ‹ˆλ‹€ index .

이것을 ILookupκ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” 경우 ILookup의 각 μΈλ±μŠ€λŠ” 단일 μš”μ†Œ/ν•­λͺ©μ΄ μ•„λ‹ˆλΌ μ—¬λŸ¬ TElementλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. Has.EntryAt λŠ” μ»¬λ ‰μ…˜, 사전 및 μΈλ±μŠ€λ‹Ή 닀쀑 μš”μ†Œ μ‘°νšŒμ™€ ν•¨κ»˜ μž‘λ™ν•˜λŠ” 것일 수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄ 초기 λ°˜μ‘μ€ Ilookupμ—μ„œ IEnumerable<TElement> λ₯Ό λ°˜ν™˜ν•˜λŠ” Has.ItemAt κ°€ μΆ©λΆ„νžˆ 이해할

λ‹€λ“€ μ–΄λ–»κ²Œ μƒκ°ν•˜μ„Έμš”? ν•˜λ‚˜ μ΄μƒμ˜ μž‘μ—…μ΄ μž‘λ™ν•˜λŠ” 것을 λ³Ό 수 있으면 μ–΄λ ΅μ§€λ§Œ μ—¬κΈ°μ—μ„œ λŒ€λ‹€μˆ˜μ˜ μ„ ν˜Έλ„λŠ” μ‚¬λžŒλ“€μ΄ κ°€μž₯ μ‰½κ²Œ 찾을 수 μžˆλŠ” 이름을 λ‚˜νƒ€λ‚΄λŠ” 데 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€. @nunit/framework-team μ΄μ™Έμ˜ μ‚¬λžŒλ“€, 당신을 λ°°μ œν•˜λ €λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. 당신이 보고 있고 κ°•ν•œ λŠλ‚Œμ΄ λ“ λ‹€λ©΄, 그것은 항상 도움이 λ˜λŠ” 데이터 ν¬μΈνŠΈμž…λ‹ˆλ‹€!

@CharliePoole Has.Property("X") λŠ” μΈμŠ€ν„΄μŠ€μ— X λΌλŠ” λ§€κ°œλ³€μˆ˜ν™”λ˜μ§€ μ•Šμ€ 속성이 μžˆλ‹€κ³  μ£Όμž₯ν•©λ‹ˆλ‹€. Has.ItemAt("X") λŠ” μΈμŠ€ν„΄μŠ€μ— λ¬Έμžμ—΄ λ§€κ°œλ³€μˆ˜λ₯Ό ν—ˆμš©ν•  수 μžˆλŠ” κΈ°λ³Έ μΈλ±μ„œ(관련성이 μ—†κ³  잘 μ•Œλ €μ§„ 이름을 가진 λ§€κ°œλ³€μˆ˜ν™”λœ 속성)κ°€ μžˆλ‹€κ³  μ£Όμž₯ν•©λ‹ˆλ‹€.

Has.Property("X").EqualTo(3) λŠ” μΈμŠ€ν„΄μŠ€μ— λ§€κ°œλ³€μˆ˜ν™”λ˜μ§€ μ•Šμ€ get μ ‘κ·Όμžλ₯Ό ν˜ΈμΆœν•˜λ©΄ 3 λ₯Ό λ°˜ν™˜ν•˜λŠ” X λΌλŠ” λ§€κ°œλ³€μˆ˜ν™”λ˜μ§€ μ•Šμ€ 속성이 μΈμŠ€ν„΄μŠ€μ— μžˆλ‹€κ³  μ£Όμž₯ν•©λ‹ˆλ‹€. Has.ItemAt("X").EqualTo(3) λŠ” μΈμŠ€ν„΄μŠ€μ— νŠΉμ • λ¬Έμžμ—΄ "X" λ₯Ό μ „λ‹¬ν•˜λ©΄ 3 λ₯Ό λ°˜ν™˜ν•˜λŠ” κΈ°λ³Έ μΈλ±μ„œ(관련이 μ—†κ³  잘 μ•Œλ €μ§„ 이름을 가진 λ§€κ°œλ³€μˆ˜ν™”λœ 속성)κ°€ μΈμŠ€ν„΄μŠ€μ— μžˆλ‹€κ³  μ£Όμž₯ν•©λ‹ˆλ‹€. get μ ‘κ·Όμž.

κΈ°λ³Έ μΈλ±μ„œμ˜ 이름이 관련이 μ—†λŠ” μ΄μœ λŠ” C#, VB 및 F# ꡬ문이 이름을 μ§€μ •ν•˜μ§€ μ•Šκ³ λ„ κΈ°λ³Έ μΈλ±μ„œλ₯Ό λͺ¨λ‘ ν˜ΈμΆœν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. (λ”°λΌμ„œ 'κΈ°λ³Έ'μ΄λΌλŠ” μš©μ–΄) κΈ°λ³Έ μΈλ±μ„œμ˜ κ°œλ…μ΄ μ—†μ§€λ§Œ λͺ…λͺ…λœ μΈλ±μ„œμ˜ κ°œλ…μ΄ μžˆλŠ” μ–Έμ–΄λŠ” 이름을 지정해야 ν•©λ‹ˆλ‹€. κΈ°λ³Έ μΈλ±μ„œμ˜ 이름은 일반적으둜 Item μ΄μ§€λ§Œ κΈ°λ³Έ μΈλ±μ„œλŠ” μž„μ˜μ˜ 이름을 지정할 수 있으며 μ΄λŸ¬ν•œ μ–Έμ–΄λŠ” 이름을 μ§€μ •ν•˜μ§€ μ•Šκ³  계속 ν˜ΈμΆœν•  수 있기 λ•Œλ¬Έμ— μ—¬μ „νžˆ κΈ°λ³Έ μΈλ±μ„œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€. C#μ—μ„œλŠ” [IndexerName("ArbitraryName")] νŠΉμ„±μ„ μ‚¬μš©ν•˜μ—¬ 이 μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

@jnm2 μ‹€μ œλ‘œ μΈλ±μ„œμ— λŒ€ν•œ λͺ¨λ“  C# λ“±μ˜ μ–Έμ–΄λ₯Ό μ΄ν•΄ν•˜μ§€λ§Œ...

λ‚˜λŠ” μž¬μ‚° 사이에 ν˜Όλž€μ˜ κ°€λŠ₯성이 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

  • μ‹€μ œ 객체의 μΈλ±μ„œ __being__
  • μΈλ±μ„œκ°€ μžˆλŠ” 객체 __returning__
  • ν•­λͺ©μ΄ ν¬ν•¨λœ μ»¬λ ‰μ…˜ __λ°˜ν™˜__

λ‚˜λŠ” __you__이(κ°€) ν˜Όλ™ν•˜μ§€ μ•Šμ„ 것이며 μ•„λ§ˆλ„ λ‹Ήμ‹ κ³Ό 이야기할 λ•Œλ§Œ κ°€μž₯ν•˜λŠ” μ²™ ν•  것이라고 κ°•μ‘°ν•˜μ§€λ§Œ(socratic method, y' know :wink:) ν•˜μ§€λ§Œ λ§Žμ€ μ‚¬λžŒλ“€μ΄ 그것을 ν˜Όλž€μŠ€λŸ½κ²Œ 생각할 수 있고 당신이 μ‚¬λžŒλ“€μ—κ²Œ μ„€λͺ…ν•  것이라고 μƒκ°ν•©λ‹ˆλ‹€. κ½€ 많이.

λ‚˜λŠ” 좔가에 λ°˜λŒ€ν•˜μ§€ μ•Šμ§€λ§Œ μœ„μ˜ ꡬ뢄은 λ¬Έμ„œμ—μ„œ μ² μžν•΄μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μΆ”μ‹ : μ „ν˜€ μ†Œμ™Έκ°μ„ λŠλΌμ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. :슀마일리:

@CharliePoole 쒋은 μƒκ°μž…λ‹ˆλ‹€. Has.ItemAt / Has.ElementAt / Has.EntryAt /etc μ€‘μ—μ„œ μ„ νƒν•˜λŠ” 데 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ“€λ¦¬λ―€λ‘œ 이름을 κ²°μ •ν•  λ•ŒκΉŒμ§€ κ³ λ € 사항을 ν‘œλ‘œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ λ‚΄κ°€ λ†“μΉœ 뢀뢄이 있고 이 ν˜Όλž€ κ°€λŠ₯성을 기반으둜 νŠΉμ • λͺ…λͺ… 선택을 μ§€μ›ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

μ§€κΈˆκΉŒμ§€ λ‚˜λŠ” ItemAt μͺ½μœΌλ‘œ 기울고 μžˆμŠ΅λ‹ˆλ‹€. @Dreamescaper , 당신도 κ·Έ μžλ¦¬μ— μžˆμŠ΅λ‹ˆκΉŒ? @CharliePoole 당신이 ElementAt λŒ€ν•œ μ„ ν˜Έλ₯Ό ν‘œν˜„ν•œ 것인지 μ•„λ‹ˆλ©΄ 단지 μš°λ¦¬κ°€ ν”„λ‘œμ„ΈμŠ€λ₯Ό 톡해 μƒκ°ν•˜λ„λ‘ λ•λŠ” 것인지 ν™•μ‹ ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

Has.ItemAt / Has.ElementAt / Has.EntryAt /other에 더 λ§Žμ€ μ‚¬λžŒλ“€μ΄ μ°Έμ—¬ν• μˆ˜λ‘ μ‚¬λžŒλ“€μ΄ μ§κ΄€μ μœΌλ‘œ λŠλ‚„ 수 μžˆλŠ” 것에 λŒ€ν•΄ 더 λ§Žμ€ 확신을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ 그보닀 훨씬 더 였래 걸리면 3.13 릴리슀λ₯Ό μ•„μ£Ό μ†ŒλŸ‰μœΌλ‘œ 놓칠 것이기 λ•Œλ¬Έμ— λ‹€μŒ λ‚  정도에 선두에 μžˆλŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” 것을 κ·Έλƒ₯ λΆ€λ₯΄κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

@jnm2 κ·Έλƒ₯ 슀슀둜 μƒκ°ν•˜κ³  κ²©λ €ν•˜λ €κ³ .

WRT 단어 선택, λ‚΄κ°€ λ‚˜μ—΄ν•œ μ„Έ 가지 μœ ν˜•μ˜ ν‘œν˜„κ³Ό μ–΄λ–€ νŠΉμ • ν‘œν˜„μ΄ κ°€μž₯ 잘 μ–΄μšΈλ¦΄μ§€, 그리고 κ±±μ •ν•  λ‹€λ₯Έ 쑰합이 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. λ‚΄κ°€ μ–ΈκΈ‰ν•œ μ„Έ 가지 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄

  • Has.ItemAt("foo").EqualTo("bar")
  • `Has.Property("λΉ™").With.ItemAt("foo").EqualTo("λ°”")
  • `Has.Property("λΉ™").With.One.EqualTo("λ°”")

κ·Έλž˜μ„œ λ‚˜λŠ” 당신이 μ˜³λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ‹¨μ–΄λŠ” μ–΄λ–€ μ˜΅μ…˜μ—λ„ μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μž₯기적으둜 λ³Ό λ•Œ λŒ€κ΄„ν˜Έλ‘œ μ‹€μ œ 인덱싱을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 클래슀 μ§‘ν•©μœΌλ‘œ λͺ¨λΈλ§ν•˜λŠ” λŒ€μ‹  μ‹€μ œλ‘œ μ œμ•½ 쑰건 ν‘œν˜„μ‹μ„ μ»΄νŒŒμΌν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 λ‚΄ κΈ‰μ—¬ λ“±κΈ‰ μ΄μƒμ΄λΌλŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” ItemAt μ’‹μ•„ν•©λ‹ˆλ‹€.

@CharliePoole이 μ œμ•ˆν•œ λŒ€λ‘œ λͺ‡ 가지 μ‚¬μš© 사둀λ₯Ό μƒκ°ν•˜λ©΄μ„œ μ‹œκ°„μ„ λ³΄λƒˆμŠ΅λ‹ˆλ‹€. ElementAt κ°€ IEnumerable μƒν™©μ—μ„œ 더 많이 μ‚¬μš©λ˜κ³  μ–Έμ–΄ μΈλ±μ„œκ°€ IEnumerable 이상을 μ²˜λ¦¬ν•  수 μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” μž μ‹œ λ™μ•ˆ ElementAt μšΈνƒ€λ¦¬μ— 앉아 μžˆλ‹€κ°€ λ‹€μŒκ³Ό 같이 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.
```c#
Assert.That(..., Has.ElementAt("ν•˜λ‚˜", "λ‘˜"));

against:
```c#
Assert.That(..., Has.ItemAt("one", "two"));

ItemAt λŠ” μ—¬λŸ¬ κ°’ μΈλ±μ„œλ₯Ό ν‘œν˜„ν•˜λŠ” 것이 더 μžμ—°μŠ€λŸ½μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œ 티켓이 μ›λž˜ 속성 μ œμ•½μ— λŒ€ν•œ 단락을 μœ„ν•΄ μ˜λ„λ˜μ—ˆμœΌλ©° ItemAt κ°€ κ·Έ μ„€λͺ…에 μ ν•©ν•˜λ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. (κ·ΈλŸ¬λ‚˜ 이것이 더/더 λ‚˜μ€/λ“±μœΌλ‘œ λ³€ν•˜λŠ” 것을 λ°°μ œν•˜μ§€ μ•ŠμœΌλ©° 단지 κ΄€μ μž…λ‹ˆλ‹€).

λ‚˜λŠ” λ˜ν•œ ItemAt μ„ ν˜Έν•˜λ―€λ‘œ λ‹€μˆ˜κ²°μ΄λΌκ³  λΆ€λ₯΄κ³  그것에 μ°¬μ„±ν•˜λŠ” κ·œμΉ™μ„ μ •ν•©μ‹œλ‹€ 😺

ν˜Όλ™μ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ™„λ£Œ ν›„ μ‹ μ†ν•˜κ²Œ λ¬Έμ„œν™”ν•˜κ³  릴리슀 정보에 ν¬ν•¨ν•˜λ„λ‘ ν•©μ‹œλ‹€.

@Poimen Re: κ·€ν•˜μ˜ κΈ‰μ—¬ λ“±κΈ‰, μš°λ¦¬κ°€ μ—¬κΈ°μ—μ„œ μ§„ν–‰ν•˜λ©΄μ„œ 우리 λͺ¨λ‘κ°€ 일을

그리고 κΈ‰λ£ŒλŠ” μ—¬κΈ° μžˆλŠ” λͺ¨λ“  뢄듀이 NUnitμ—μ„œ μΌν•˜λ©΄μ„œ 0λ‹¬λŸ¬ μ •λ„μ˜ 연봉을 λ°›κ³  있기 λ•Œλ¬Έμ— λͺ¨λ‘ 같은 κΈ‰λ£ŒλΌκ³  μƒκ°ν•©λ‹ˆλ‹€ 😝

@Dreamescaper λŠ” PRμ—μ„œ 또 λ‹€λ₯Έ 쒋은 μ§ˆλ¬Έμ„ ν–ˆμŠ΅λ‹ˆλ‹€. μ–‘μˆ˜μ΄λ“  μŒμˆ˜μ΄λ“  μΈλ±μ„œκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” λŒ€μ‹  개수λ₯Ό ν™•μΈν•˜λŠ” 것과 κ°™μŠ΅λ‹ˆλ‹€.

Assert.That(new[] { 1, 2, 2 }, Has.ItemAt(3));
Assert.That(new[] { 1, 2, 2 }, Has.No.ItemAt(3));

생각할 μ‹œκ°„μ΄ 더 생길 λ•ŒκΉŒμ§€ Exists μ œμ•½ 쑰건을 μ œκ±°ν•˜λŠ” 것이 κ°€μž₯ μ•ˆμ „ν•΄ λ³΄μž…λ‹ˆλ‹€. μΈλ±μ„œ 쑴재 확인을 μœ„ν•΄ Has.Indexer(typeof(Type1), typeof(Type2), ...) λŒ€ν•΄ λ³„λ„μ˜ 문제λ₯Ό μ—¬λŠ” 것을 μ„ ν˜Έν•˜κ³  μ‹€μ œλ‘œ μΈλ±μ„œλ₯Ό μ‹€ν–‰ν•˜κ³  κ²°κ³Ό 값에 λŒ€ν•΄ μ£Όμž₯ν•˜λ €λ©΄ Has.ItemAt(arg1, arg2, ...) 에 λŒ€ν•΄ λ³„λ„μ˜ 문제λ₯Ό μ—¬λŠ” 것을 μ„ ν˜Έν•©λ‹ˆλ‹€.

μ²˜μŒμ— Has.ItemAt(3) λ₯Ό μ œμ•½ 쑰건으둜 ν•΄κ²°ν•˜μ§€ μ•Šκ³  Has.ItemAt(3).EqualTo(4) λ₯Ό ν•΄κ²°ν•˜λŠ” 데 λ°˜λŒ€ν•˜λŠ” μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

Has.Indexer λŠ” λ‚˜μ—κ²Œ μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ œμ•½ 쑰건과의 일관성을 μœ„ν•΄ Has.Indexer<T>() , Has.Indexer<T1, T2>() 등도 μ§€μ›ν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

ν”Όλ“œλ°±μ„ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! Has.ItemAt(...)κ°€ 더 이상 자체 ν•΄κ²°λ˜μ§€ μ•Šλ„λ‘ pull μš”μ²­μ„ μ§„ν–‰ν–ˆμœΌλ©° Has.Indexer 을 μΆ”μ ν•˜κΈ° μœ„ν•΄ https://github.com/nunit/nunit/issues/3690 을 μ œμΆœν–ˆμŠ΅λ‹ˆλ‹€. Has.Indexer λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰