Модульное тестирование с компьютерными состояниями - PullRequest
0 голосов
/ 29 августа 2009

Я пишу модульный тест, когда мой компьютер получает / делает телефонный звонок.

Тестируемые методы - это события, которые обрабатывают входящий / исходящий вызов. Если вызывающий абонент не является утвержденным, вызов отклоняется.

Код работает нормально, но я не могу найти ничего, с чем можно было бы проверить мой модульный тест. Проблема в том, что фактическое состояние «если мой компьютер находится в состоянии вызова или нет» - это , а не , контролируемое моим классом. Только компьютер знает, подключен ли вызов в данный момент или нет.

Я надеюсь, что есть несколько Гуру модульных тестов, которые подскажут мне, что делать, чтобы протестировать этот сценарий. Я не хочу создавать фиктивную переменную, которая не имеет отношения к моему коду, просто чтобы пройти мой модульный тест.

Чтобы сделать это немного конкретнее, вот мой модульный тест:

    private DeviceMediator deviceMediator;
    private IDeviceControlForm deviceControlForm;
    private IDataAccess data;
    private ICallMonitor callMonitor; 

    // Use TestInitialize to run code before running each test 
    [TestInitialize()]
    public void MyTestInitialize()
    {
        deviceControlForm = MockRepository.GenerateStub<IDeviceControlForm>();          
        data = MockRepository.GenerateStub<IDataAccess>();
        callMonitor = MockRepository.GenerateStub<ICallMonitor>();

        deviceMediator = new DeviceMediator(deviceControlForm, data) 
           {CallMonitor = callMonitor};
    }

    [TestMethod]
    public void TestHandleIncomingCall()
    {
        //Arrange

        //Act
        deviceMediator.OnIncomingCall(null, new CallState(), 
           new CallInfoState());

        //Assert
        // I could not find anything to feasably test on this.  
        Assert.IsTrue(true);
    }

и вот метод, который он вызывает:

public void OnIncomingCall(Call call, CallState callState, 
    CallInfoState callInfoState)
{
    // See if this call is on our list of approved callers
    bool callApproved = false;
    foreach (PhoneContact phoneContact in Whitelist)
    {
        if (phoneContact.PhoneNumber == call.CallerID)
            callApproved = true;
    }

    // If this is not an approved call then 
    if (!callApproved)
        CallMonitor.Hangup();
}

Ответы [ 3 ]

2 голосов
/ 29 августа 2009

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

Это мой код с включенным ответом.

Модульный тест:

    [TestMethod]
    public void TestHandleIncomingCall()
    {
        //Arrange
        callMonitor.InCall = true;
        // This is the magic.  When Hangup is called I am able to set
        // the stub's InCall value to false.
        callMonitor.Expect(x => x.Hangup()).Callback(() => WhenCalled(invocation =>
                                                       {
                                                           callMonitor.InCall = false;
                                                       });
        List<PhoneContact> whiteList = FillTestObjects.GetSingleEntryWhiteList();
        data.Expect(x => x.GetWhiteListData()).Return(whiteList);
        const string invalidPhoneNumber = "123";

        //Act
        deviceMediator.HandleIncomingCall(invalidPhoneNumber);

        //Assert
        Assert.IsFalse(callMonitor.InCall);
    }

Мне пришлось изменить свой код на это, потому что у Call есть внутренний конструктор:

    public void OnIncomingCall(Call call, CallState callState, 
       CallInfoState callInfoState)
    {
        // See if this call is on our list of approved callers
        HandleIncomingCall(call.CallerID);
    }

    public void HandleIncomingCall(string callNumber)
    {
        bool callApproved = false;
        foreach (PhoneContact phoneContact in Whitelist)
        {
            if (phoneContact.PhoneNumber == callNumber)
                callApproved = true;
        }

        // If this is not an approved call then 
        if (!callApproved)
            CallMonitor.Hangup();
    }
1 голос
/ 29 августа 2009

Это называется инъекцией зависимости. Вы заставляете свой код действовать на интерфейсе, который имитирует реальный API-интерфейс телефона, и предоставляете собственную контролируемую реализацию для тестов. Существуют такие системы, как Spring.Net, которые делают это проще.

0 голосов
/ 29 августа 2009

Вот пара вещей, которые вы могли бы сделать:

  1. Вы можете создать фиктивную коллекцию WhiteList, которая будет содержать определенный набор PhoneContacts, а затем вызвать OnIncomingCall с PhoneContacts, которые есть или нет в WhiteList, а затем проверить CallMonitor (или сам объект Call, я полагаю) Посмотрите, находится ли вызов в правильном состоянии. Поэтому Assert.IsTrue (call.IsConnected) или Assert.IsFalse (call.IsConnected) в зависимости от сценария, который вы тестируете.
  2. Вы также можете увидеть, обрабатывает ли метод объекты Call с нулевым или неправильным состоянием в точке вызова этого метода.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...