2011-01-19 2 views
4

Учитывая вызывающий кодпроверки списка, используя малое количество заказа

List<Person> loginStaff = new List<Person>(); 

loginStaff.add(new Person{FirstName = "John", LastName = "Doe"}); 

this._iViewLoginPanel.Staff = loginStaff; 

Что такое синтаксис для проверки того, что существует персонал по имени John Doe, и что есть по крайней мере один сотрудник был установлен? В настоящее время все примеры, которые я видел, довольно простые, используя только It.IsAny или Staff = некоторый базовый тип, но никто фактически не проверяет данные в сложных типах списков.

Мои утверждают выглядит

this._mockViewLoginPanel.VerifySet(x=> x.Staff = It.IsAny<List<Person>>()); 

, который только проверяет тип, данные сеттерам, но не размер или предметы внутри самого списка. Я пытался сделать что-то вроде этого:

 this._mockViewLoginPanel.VerifySet(
      x => 
      { 
       List<string> expectedStaffs = new List<string>{"John Doe", "Joe Blow", "A A", "Blah"}; 
       foreach (Person staff in x.Staff) 
       { 
        if (!expectedStaffs.Contains(staff.FirstName + " " + staff.LastName)) 
         return false; 
       } 
       return true; 
      }); 

Но что говорит мне, что тело лямбда-оператор не может быть преобразован в дерево выражения. Тогда я получил идею сдачи тела оператора в функцию и работает, но во время выполнения я получаю:

System.ArgumentException: Expression не является свойством сеттер вызова.

Update: В свете первых двух ответов использовать утверждают, я попробовал этот метод, но обнаружил, что даже после установки Staff с не список нулевой, он по-прежнему отображается в отладочных как нулевое. Так что это как полный тест выглядит

[TestMethod] 
public void When_The_Presenter_Is_Created_Then_All_CP_Staff_Is_Added_To_Dropdown() 
{ 
    this._mockViewLoginPanel = new Mock<IViewLoginPanel>(); 

    PresenterLoginPanel target = new PresenterLoginPanel(this._mockViewLoginPanel.Object); 

    this._mockViewLoginPanel 
     .VerifySet(x => x.Staff = It.IsAny<List<Person>>()); 

    Assert.AreEqual(5, this._mockViewLoginPanel.Object.Staff.Count); 
} 

и где-то в конструкторе PresenterLoginPanel

public PresenterLoginPanel 
{ 
    private IViewLoginPanel _iViewLoginPanel; 

    public PresenterLoginPanel(IViewLoginPanel panel) 
    { 
     this._iViewLoginPanel = panel; 
     SomeFunction(); 
    } 

    SomeFunction() { 
     List<Person> loginStaff = new List<Person>(); 

     loginStaff.add(new Person{FirstName = "John", LastName = "Doe"}); 

     this._iViewLoginPanel.Staff = loginStaff; 
    } 
} 

Когда я отлаживать к следующей строке, this._iViewLoginPanel.Staff равно нулю, который является то, что причиной исключения нулевого в утверждают ,

+0

Вы назначая конструктор параметр переменной класса? –

+0

да, я назначаю параметр this._mockViewLoginPanel.Object для переменной this._iViewLoginPanel – Joe

+0

Можете ли вы вставить строку кода в конструктор, который это делает? –

ответ

10

Вместо того, чтобы использовать методы макета, вы можете использовать методы NUnit, чтобы делать утверждения о содержимом макетного объекта.

После того, как вы назначили список объекту и подтвердили, что он был установлен, используйте утверждения для проверки специфики, например, подсчета элементов и того, что первый объект соответствует тому, что вы ожидаете от него.

Assert.That(this._mockViewLoginPanel.Object.Staff.Length, Is.EqualTo(1)); 
Assert.That(this._mockViewLoginPanel.Object.Staff[0], Is.Not.Null); 
Assert.That(this._mockViewLoginPanel.Object.Staff[0], Is.EqualTo(loginStaff[0])); 

Редактировать

После дальнейшего исследования это сводится к Mock поведения. Свойства Staff и Person были неправильно настроены.

ли установка их, изменить ваш макет создание этого:

var _mockViewLoginPanel = new Mock<IViewLoginPanel>(MockBehavior.Strict); 
_mockViewLoginPanel.SetupAllProperties(); 

Полный код распечатка демо является:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public interface IViewLoginPanel 
{ 
    IList<Person> Staff { get; set; } 
} 

public class PresenterLoginPanel { 

    private IViewLoginPanel _iViewLoginPanel; 

    public PresenterLoginPanel(IViewLoginPanel panel) 
    { 
     _iViewLoginPanel = panel; 
     SomeFunction(); 
    } 

    public void SomeFunction() 
    { 
     List<Person> loginStaff = new List<Person>(); 

     loginStaff.Add(new Person{FirstName = "John", LastName = "Doe"}); 

     _iViewLoginPanel.Staff = loginStaff; 
    } 

    public IViewLoginPanel ViewLoginPanel 
    { 
     get { return _iViewLoginPanel; } 
    } 
} 

[TestFixture] 
public class PresenterLoginPanelTests 
{ 
    [Test] 
    public void When_The_Presenter_Is_Created_Then_All_CP_Staff_Is_Added_To_Dropdown() 
    { 
     var _mockViewLoginPanel = new Mock<IViewLoginPanel>(MockBehavior.Strict); 
     _mockViewLoginPanel.SetupAllProperties(); 

     PresenterLoginPanel target = new PresenterLoginPanel(_mockViewLoginPanel.Object); 

     _mockViewLoginPanel.VerifySet(x => x.Staff = It.IsAny<List<Person>>()); 

     Assert.AreEqual(5, _mockViewLoginPanel.Object.Staff.Count); 
    } 

} 
+0

* facepalms * конечно, я слишком много фокусировался на обучении moq и недостаточно на тестировании на складе. – Joe

+0

На самом деле, я принял слишком быстро, когда я использую ваш код, он дает мне ссылку на объект null, потому что свойство Staff не сохраняются. (Я отлаживался, чтобы убедиться, что он установлен, но сразу после его установки, значение по-прежнему равно нулю) – Joe

+0

Я заметил, что у вас есть '_iViewLoginPanel' и' _mockViewLoginPanel'. 'Staff' устанавливается на' _iViewLoginPanel', 'Assert' выполняется на' _mockViewLoginPanel'. Я пропустил это в первый раз. Они должны быть одним и тем же объектом? –

1

Проверяется что количество сотрудников должно быть больше, чем 0 , что должен быть хотя бы один элемент, который не является нулевым, и существует хотя бы один элемент, имеющий первое имя, равное Joe. если вы хотите сравнить объекты, вам нужно будет добавить компаратор.

Assert.AreNotEqual(this._mockViewLoginPanel.Object.Staff.Count, 0); 
Assert.AreNotEqual(this._mockViewLoginPanel.Object.Staff.All(x => x == null), true); 
Assert.AreEqual(this._mockViewLoginPanel.Object.Staff.Any(x => x.FirstName == "Joe"), true); 
6

Вы можете легко сделать это с самого Moq (также, когда вы уже не есть ссылка на ожидаемый результат объекта) - просто используйте It.Is(..) метод:

_mockViewLoginPanel.VerifySet(x => x.Staff = It.Is<List<Person>>(staff => staff.Count == 5)); 
_mockViewLoginPanel.VerifySet(x => x.Staff = It.Is<List<Person>>(staff => staff[0].FirstName == "John")); 
+2

Это должно быть отмечено как принятый ответ! –

Смежные вопросы