Как утверждать, что коллекция содержит только один элемент с заданным значением свойства? - PullRequest
11 голосов
/ 01 июня 2011

Как мне утверждать, что коллекция содержит только один элемент с заданным значением свойства?

Например:

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"));
}

Ответы [ 2 ]

18 голосов
/ 21 ноября 2013

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));
0 голосов
/ 01 июня 2011

Почему бы не использовать немного 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
...