मेरे पास यह जांचने के लिए एक इकाई परीक्षण है कि कोई विधि सही IEnumerable
देता है या नहीं। विधि yield return
का उपयोग करके गणना करने योग्य बनाता है। वर्ग इसके बारे में एक गणनीय है कि नीचे है:Assert.AreEqual दो जेनेरिक IENumerables के बीच समानता निर्धारित करता है?
enum TokenType
{
NUMBER,
COMMAND,
ARITHMETIC,
}
internal class Token
{
public TokenType type { get; set; }
public string text { get; set; }
public static bool operator == (Token lh, Token rh) { return (lh.type == rh.type) && (lh.text == rh.text); }
public static bool operator != (Token lh, Token rh) { return !(lh == rh); }
public override int GetHashCode()
{
return text.GetHashCode() % type.GetHashCode();
}
public override bool Equals(object obj)
{
return this == (Token)obj;
}
}
इस विधि के प्रासंगिक हिस्सा है: यदि मैं actual
में इस विधि के परिणाम की दुकान
foreach (var lookup in REGEX_MAPPING)
{
if (lookup.re.IsMatch(s))
{
yield return new Token { type = lookup.type, text = s };
break;
}
}
, एक और गणनीय expected
बनाने के लिए, और उन्हें इस तरह तुलना करें ...
Assert.AreEqual(expected, actual);
..., दावा विफल रहता है।
मैं IEnumerable
के लिए एक विस्तार विधि ने लिखा है कि Python's zip
function के समान है (यह जोड़ों का एक समूह में दो IEnumerables को जोड़ती है) और इस की कोशिश की:
foreach(Token[] t in expected.zip(actual))
{
Assert.AreEqual(t[0], t[1]);
}
यह काम किया! तो इन दो Assert.AreEqual
एस के बीच क्या अंतर है?
@Jason बेकर: यह गलत नहीं लेते हैं तो कृपया वैसे, क्या आपने सोचा है कि इस तथ्य को आपको इस तरह के सवाल पूछना है, इसका मतलब यह हो सकता है कि आप चीजों को बहुत जटिल बना रहे हैं? –
एआरएम ... नहीं, वास्तव में नहीं। :-) क्या आप मुझे इंगित कर सकते हैं कि मैं कहां जटिल बना रहा हूं? –
इसके अलावा, मुझे विश्वास नहीं है कि "text.GetHashCode()% type.GetHashCode();" GetHashCode() के लिए वापसी मूल्य के रूप में एक अच्छा विचार है ... –