Так у меня есть класс Doorcontrol, который может иметь 4 состоянияКак вызвать функцию только, когда в конкретном случае в случае коммутатора для модульного теста?
public enum DoorControlState
{
DoorClosed,
DoorOpening,
DoorOpen,
DoorBreached
}
Чтобы открыть дверь accescode необходима, код затем проверяется и если это правильно дверь открыта. Если дверь не находится в закрытом состоянии, ничего не должно произойти. Он должен выглядеть так: RequestEntry (id) [Doorcontrol] -> ValidateEntryRequest (id) [IUserValidation] -> OK [Doorcontrol] -> Открыть [IDoor] -> изменить состояние на DoorOpening. Затем Idoor вызывает DoorOpen, и состояние изменяется на DoorOpen и так далее.
я реализовал класс DoorControl следующим
public class DoorControl
{
private IDoor _door;
private IEntryNotification _entryNotification;
private IUserValidation _userValidation;
private DoorControlState _doorControlState;
private int _id;
public DoorControl(IDoor door, IEntryNotification entryNotification, IUserValidation userValidation, DoorControlState doorControlState)
{
_door = door;
_entryNotification = entryNotification;
_userValidation = userValidation;
_doorControlState = doorControlState;
}
public void Run()
{
switch (_doorControlState)
{
case DoorControlState.DoorClosed:
bool foo = RequestEntryId();
if (foo)
{
_door.Open();
_doorControlState = DoorControlState.DoorOpening;
}
break;
case DoorControlState.DoorOpening:
_door.Close();
_doorControlState = DoorControlState.DoorOpen;
break;
case DoorControlState.DoorOpen:
// Do stuff....
break;
case DoorControlState.DoorBreached:
// Do stuff
break;
default:
throw new InvalidEnumArgumentException();
}
}
private bool RequestEntryId()
{
bool maybeFoo = _userValidation.ValidateEnetryRequest();
if (maybeFoo = true)
{
return true;
}
return false;
}
public void DoorOpened()
{
//
}
public void DoorClosed()
{
//
}
}
}
В UserValidation и дверные классы реализованы как интерфейсы
public interface IUserValidation
{
bool ValidateEnetryRequest();
}
public interface IDoor
{
void Open();
void Close();
}
Я проверяю свой код, используя NUnit и NSubstitute
namespace DoorControl.Unit.Test
{
[TestFixture]
public class DoorControlUnitTest
{
private DoorControl _uut;
private IDoor _door;
private IEntryNotification _entryNotification;
private IUserValidation _userValidation;
private DoorControlState _doorControlState;
[SetUp]
public void SetUp()
{
_door = Substitute.For<IDoor>();
_entryNotification = Substitute.For<IEntryNotification>();
_userValidation = Substitute.For<IUserValidation>();
_doorControlState = DoorControlState.DoorClosed;
_uut = new DoorControl(_door, _entryNotification, _userValidation, _doorControlState);
}
[Test]
public void InputCorrectId()
{
_userValidation.ValidateEnetryRequest().Returns(true);
_uut.RequestEntryId(); // Can't called that cause it's private
_door.Received().Open();
}
}
}
Я не могу понять, как заставить его вызывать RequestEntryId только тогда, когда он находится в состоянии «Закрыто» и игнорирует его, если он находится в другом состоянии.
Редактировать: Что означает, что Doorcontrol находится внутри, должно быть скрыто от всех остальных.
Рассмотрите возможность применения шаблона стратегии вместо использования операторов switch – Nkosi