我有一个
IEnumerable<KeyValuePair<string,string>>
在这个IEnumerable中我有一个名为“JobDetails”的密钥为了确保这个密钥存在,我使用以下语句;
var avalue = from val in tokensReturned where val.Key == "JobDetails" select val.Key;
我期望传递这个断言,因为Key就在那里
Assert.AreEqual("JobDetails", avalue);
我得到的信息是预期的:'J'但是“JobDetails”
还表示值在索引0处不同
如果我在断言中将.first()添加到avalue然后测试通过,这是正确的做法吗?我是一个LINQ新手并且不想添加。首先因为它有效,我想知道正确的做法是什么。
提前致谢
答案 0 :(得分:3)
是的,您必须添加.First()
... select
将返回另一个IEnumerable<>
,其元素与tokensReturned
中Key == "JobDetails"
的元素一样多}}。具有0或1个元素的IEnumerable<T>
仍为IEnumerable<T>
。它并非隐含/自动“十年”到其“通用”T
类型(在您的情况下为string
)。通过使用.First()
,您可以提取IEnumerable<T>
的第一个元素,即T
个对象。如果没有元素,你会得到一个例外。
如果您确定应该有一个元素,我经常建议使用.Single()
,这将检查是否有1个元素(这是一个额外的检查,在您使用DB时很有用,你在哪里认为应该返回1个元素并不总是返回1个元素,因为您认为包含在DB中的内容并不完全是DB中包含的内容。
答案 1 :(得分:1)
由于您已经过滤掉了那些匹配的项目,因此您只需要检查您拥有的项目数量:
Assert.AreEqual(1, avalue.Count());
如果您尝试使用First()
或Single()
提取第一个项目,则会冒着测试抛出非断言异常的风险,因为您没有拥有第一个(或单个)项目。