2011-06-01 14 views
8

मैं कैसे कहूं कि संग्रह में दिए गए संपत्ति मूल्य के साथ केवल एक तत्व है?यह कहने के लिए कि उस संग्रह में दिए गए संपत्ति मूल्य के साथ केवल एक तत्व है?

class Node 
{ 
    private readonly string myName; 
    public Node(string name) 
    { 
    myName = name; 
    } 
    public string Name { get; set; } 
} 

[Test] 
public void Test() 
{ 
    var array = new[]{ new Node("1"), new Node("2"), new Node("1")}; 
    Assert.That(array, Has.Some.Property("Name").EqualTo("1")); 
    Assert.That(array, Has.None.Property("Name").EqualTo("1")); 

    // and how to assert that node with Name="1" is single? 
    Assert.That(array, Has.???Single???.Property("Name").EqualTo("1")); 
} 

उत्तर

14

1: आप Has.Exactly() बाधा का उपयोग कर सकते हैं: "नाम"

Assert.That(array, Has.Exactly(1).Property("Name").EqualTo("1")); 

लेकिन, आप मामले संपत्ति में रनटाइम त्रुटि मिल जाएगा ध्यान दें के बाद से संपत्ति प्रतिबिंब द्वारा प्राप्त है अस्तित्व में नहीं होगा

2: (अनुशंसित) हालांकि, स्ट्रिंग के बजाय भविष्यवाणी करके संपत्ति प्राप्त करना बेहतर होगा।

Assert.That(array, Has.Exactly(1).Matches<Node>(x => x.Name == "1"));  

3: मामले संपत्ति नाम मौजूद नहीं होगा, आप एक संकलन त्रुटि प्राप्त होगी या फिर, आप Count विधि पर भरोसा कर सकते हैं:

Assert.That(array.Count(x => x.Name == "1"), Is.EqualTo(1)); 
1

क्यों LINQ का एक सा प्रयोग नहीं करते:

उदाहरण के लिए

?

Assert.IsTrue(array.Single().Property("Name").EqualTo("1")); // Single() will throw exception if more then one 

या

Assert.IsTrue(array.Count(x => x.Property("Name").EqualTo("1") == 1); // will not 
+0

LINQ का उपयोग क्यों नहीं करते बजाय NUnit सब पर इस बात पर ज़ोर ? Assert.IsTrue (array.Where (x => x.Property ("name") == 1) .एनी()); Assert.IsFalse (array.Where (x => x.Property ("name") == 1) .एनी()); ;) –