单元测试计算机拥有国(Unit Testing With Computer Owned States

2019-10-29 05:01发布

我写这封信时,我的计算机接收/打一个电话的单元测试。

被测试的方法是处理呼入/呼出的事件。 如果来电者是不是认可主叫然后呼叫被拒绝。

该代码工作正常,但我真的不能找到任何针对测试对于我的单元测试。 问题是,实际的状态,“如果我的电脑是在通话中或不是” 控制我的班。 只有计算机知道如果呼叫当前连接与否。

我希望有一些单元测试师的在那里不是能告诉我该怎么来测试此方案是什么。 我不想创建一个没有关系我的代码只是为了让我的单元测试循环中的虚拟变种。

为了使这个多一点具体的,这里是我的单元测试:

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

Answer 1:

原来我只是不知道有足够的了解犀牛制品。 回答这个问题,可以发现在这里 。

这是我的代码以纳入这个问题的答案。

单元测试:

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

我有我的代码改变这一点,因为呼叫有内部的构造函数:

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


Answer 2:

这就是所谓的扶养注射。 你让模仿真实电话API接口上你的代码的行为,并提供自己的控制实施测试。 有系统有像Spring.Net,使这更容易做。



Answer 3:

这里有几件事情你可以做:

  1. 你可以创建一个模拟白名单集合将包含一组特定的PhoneContacts的,然后调用OnIncomingCall用是或不是白名单PhoneContacts然后检查CallMonitor(或Call对象本身,我想),看看是否通话是在正确的状态。 所以Assert.IsTrue(call.IsConnected)或Assert.IsFalse(call.IsConnected)根据情况你测试。
  2. 你也可以看到,如果方法处理是无效或不正确的状态,在那里该方法被调用点呼叫对象。


文章来源: Unit Testing With Computer Owned States