νμ¬λ‘μλ μΌλ° μμ±μ κ°λ§ ν μ€νΈν μ μμΌλ©° μΈλ±μ κ°μ ν μ€νΈν λ°©λ²μ μμ΅λλ€. λ€μκ³Ό κ°μ ν μ€νΈλ₯Ό μμ±ν΄μΌ ν©λλ€.
```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"));
}
}
```
μμ΄λμ΄κ° λ§μμ λλλ€.
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# λ±μ μΈμ΄λ₯Ό μ΄ν΄νμ§λ§...
λλ μ¬μ° μ¬μ΄μ νΌλμ κ°λ₯μ±μ΄ μλ€κ³ μκ°ν©λλ€.
λλ __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")
κ·Έλμ λλ λΉμ μ΄ μ³λ€κ³ μκ°ν©λλ€. λ¨μ΄λ μ΄λ€ μ΅μ μλ μ€μνμ§ μμ΅λλ€.
μ₯κΈ°μ μΌλ‘ λ³Ό λ λκ΄νΈλ‘ μ€μ μΈλ±μ±μ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. κ·Έλ¬λ ν΄λμ€ μ§ν©μΌλ‘ λͺ¨λΈλ§νλ λμ μ€μ λ‘ μ μ½ μ‘°κ±΄ ννμμ μ»΄νμΌν΄μΌ ν©λλ€.
λλ μ΄κ²μ΄ λ΄ κΈμ¬ λ±κΈ μ΄μμ΄λΌλ κ²μ μκ³ μμ΅λλ€.
λλ 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
λ₯Ό μ¬μ©νμ¬ ν΄λΉ κΈ°λ₯μ μ 곡ν©λλ€.
κ°μ₯ μ μ©ν λκΈ
κ·Έλ¦¬κ³ κΈλ£λ μ¬κΈ° μλ λͺ¨λ λΆλ€μ΄ NUnitμμ μΌνλ©΄μ 0λ¬λ¬ μ λμ μ°λ΄μ λ°κ³ μκΈ° λλ¬Έμ λͺ¨λ κ°μ κΈλ£λΌκ³ μκ°ν©λλ€ π