2015-01-02 3 views
0

В настоящее время я использую nSubstitute и nUnit для выполнения некоторых модульных тестов. Я новичок, когда дело доходит до этого, поэтому любая помощь будет очень признательна. Пожалуйста, посмотрите на этот код:Шаблон изменения шаблона контекстного шаблона состояния штата - как модульный тест.

public class Event 
{ 
    private ISet<Host> hostSet; 
    private IEventState eventState; 

    public Event() 
    { 
     hostSet = new HashSet<Host>(); 
     eventState = new StartedEvent(); 
    } 

    public virtual string Name { get; protected internal set; } 

    public virtual bool CanSetName() 
    { 
     return eventState.CanSetName(); 
    } 

    public virtual void SetName(string name) 
    { 
     eventState.SetName(this, name); 
    } 

    internal virtual ISet<Host> HostSet 
    { 
     get 
     { 
      return hostSet; 
     } 
    } 

    public virtual ReadOnlyCollection<Host> HostCollection 
    { 
     get 
     { 
      return new ReadOnlyCollection<Host>(hostSet.ToList()); 
     } 
    } 

    public virtual bool CanAddHost() 
    { 
     return eventState.CanAddHost(); 
    } 

    public virtual void AddHost(string firstName, string lastName) 
    { 
     eventState.AddHost(this, firstName, lastName); 
    } 

    internal virtual void ChangeState(IEventState eventState) 
    { 
     this.eventState = eventState; 
    } 

} 

public class Host 
{ 
    private readonly string firstName; 
    private readonly string lastName; 

    public Host(string firstName, string lastname) 
    { 
     this.firstName = firstName; 
     this.lastName = lastname; 
    } 

    public string FirstName 
    { 
     get 
     { 
      return firstName; 
     } 
    } 

    public string LastName 
    { 
     get 
     { 
      return lastName; 
     } 
    } 
} 

public interface IEventState 
{ 
    bool CanSetName(); 
    void SetName(Event evnt, string Name); 
    bool CanAddHost(); 
    void AddHost(Event evnt, string firstName, string lastName); 
} 

internal class StartedEvent : IEventState 
{ 

    public bool CanSetName() 
    { 
     return true; 
    } 

    public void SetName(Event evnt, string name) 
    { 
     evnt.Name = name; 
    } 

    public bool CanAddHost() 
    { 
     return true; 
    } 

    public void AddHost(Event evnt, string firstName, string lastName) 
    { 
     evnt.HostSet.Add(new Host(firstName, lastname)); 
    } 
} 

[TestFixture] 
public class StartedEventState 
{ 
    [Test] 
    public void CanSetName_Always_ReturnsTrue() 
    { 
     IEventState eventState = new StartedEvent(); 
     bool result = eventState.CanSetName(); 
     Assert.True(result); 
    } 

    [Test] 
    public void SetName_WhenCalled_ChangesTheEventName() 
    { 
     Event evnt = Substitute.For<Event>(); 
     IEventState eventState = new StartedEvent(); 
     eventState.SetName(evnt, "Test Event"); 
     evnt.Received().Name = "Test Event"; 
    } 

    [Test] 
    public void CanAddHost_Always_ReturnsTrue() 
    { 
     IEventState eventState = new StartedEvent(); 

     bool result = eventState.CanAddHost(); 

     Assert.True(result); 
    } 

    [Test] 
    public void AddHost_WhenCalled_AddsTheHostToTheEvent() 
    { 
     //No idea how to test this? 
    } 
} 

[TestFixture] 
public class EventTests 
{ 
    [Test] 
    public void CanSetName_WhenCalled_DelegatesToItsCurrentState() 
    { 
     Event evnt = new Event(); 
     var eventState = Substitute.For<IEventState>(); 
     evnt.ChangeState(eventState); 
     evnt.CanSetName(); 
     evnt.Received().CanSetName(); 
    } 
} 

Испытания, которые в настоящее время написаны, все проходят. Однако я не знаю, как выполнить тест, чтобы метод StartedEvent.AddHost правильно вызывал класс контекста и добавлял его в набор. Я пробовал несколько разных вещей, но потерпел неудачу.

1) Может кто-то указать мне в правильном направлении относительно того, как я иду на тестирование этого метода. 2) Было бы хорошо, если бы кто-то мог подтвердить, что мои существующие тесты в порядке.

+0

Я вижу только одно состояние в дизайне. Ваш код неполный? Не знаете, почему вы используете шаблон состояния. У вас есть диаграмма перехода состояния (или таблица), которая показывает, как должен работать ваш код? Тестирование должно проверять эти переходы. – Fuhrmanator

+0

Да, код неполный, есть целая куча других состояний. Мне комфортно проверять переход из одного состояния в другое. –

ответ

1

Чтобы проверить StartedEvent.AddHost:

  1. Создать Event

    Событие = новое событие();

  2. Создать EventState

    IEventState EventState = новый StartedEvent();

  3. Вызов StartedEvent.AddHost на нем:

    eventstate.AddHost (событие, "Firstname", "фамилия");

  4. Проверьте event.HostSet, проверяя, что она содержит только один случай, и что это событие содержит тестовые данные вы указали

Единственные вопросы, которые я вижу с существующими тесты, которые SetName_WhenCalled_ChangesTheEventName и CanSetName_WhenCalled_DelegatesToItsCurrentState не Assert ничего.

+0

Спасибо, что нашли время, чтобы ответить. Что касается моих существующих тестов. Мне не нужно ничего утверждать в контексте класса, поскольку я просто проверяю, что класс контекста вызывает класс состояния. Утверждение будет выполнено, когда будет проверено каждое отдельное государство? Я дам ему еще один шаг, чтобы проверить хосты и сообщить вам о проблемах, которые у меня есть. веселит. –

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