繁体   English   中英

计算机拥有国的单元测试

[英]Unit Testing With Computer Owned States

我正在编写有关计算机何时接听/拨打电话的单元测试。

被测试的方法是处理传入/传出呼叫的事件。 如果呼叫者不是批准的呼叫者,则该呼叫将被拒绝。

该代码可以正常工作,但对于单元测试,我真的找不到任何要测试的东西。 问题是“是否在通话中”的实际状态不受班级控制。 只有计算机知道当前是否连接了呼叫。

我希望那里有一些单元测试专家,可以告诉我如何测试这种情况。 我不想创建一个与我的代码无关的虚拟变量,只是为了使我的单元测试通过。

为了使这一点更加具体,这是我的单元测试:

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

原来我只是对Rhino Mocks不够了解。 这个问题的答案可以在这里找到。

这是我的代码,其中包含了答案。

单元测试:

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

这称为依赖注入。 您可以使代码在模仿真实Phone API的接口上起作用,并为测试提供自己的可控制实现。 有像Spring.Net这样的系统可以使此操作更容易实现。

您可以执行以下几项操作:

  1. 您可以创建一个模拟的WhiteList集合,该集合将包含一组特定的PhoneContacts,然后使用不在WhiteList中或不在WhiteList中的PhoneContacts调用OnIncomingCall,然后检查CallMonitor(或者我想是Call对象本身)以查看通话状态正确。 因此,Assert.IsTrue(call.IsConnected)或Assert.IsFalse(call.IsConnected)取决于您正在测试的方案。
  2. 您还可以看到该方法在调用此方法时是否处理了null或状态不正确的Call对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM