计算机拥有国的单元测试

时间:2009-08-28 20:59:51

标签: c# visual-studio unit-testing

我正在为我的电脑接听/拨打电话进行单元测试。

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

代码工作正常,但我无法找到任何可以测试我的单元测试的东西。问题是“如果我的计算机处于通话中”的实际状态是按类控制我。只有计算机才知道当前是否有呼叫连接。

我希望有一些单元测试大师可以告诉我如何测试这个场景。我不想创建一个与我的代码无关的虚拟var,只是为了使我的单元测试通过。

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

    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 个答案:

答案 0 :(得分:2)

原来我对Rhino Mocks不太了解。可以找到此问题的答案here

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

单元测试:

    [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 :(得分:1)

它被称为依赖注射。您使代码在模拟真实Phone api的接口上运行,并为测试提供您自己的可控实现。像Spring.Net这样的系统可以让你更容易做到。

答案 2 :(得分:0)

以下是您可以做的几件事:

  1. 您可以创建一个模拟的WhiteList集合,其中包含一组PhoneContacts,然后使用PhoneList在WhiteList中调用OnIncomingCall,然后检查CallMonitor(或者我调用的Call对象本身)查看呼叫是否处于正确状态。所以Assert.IsTrue(call.IsConnected)或Assert.IsFalse(call.IsConnected)取决于您正在测试的场景。
  2. 您还可以查看该方法是否处理在调用此方法时处于null或未处于正确状态的Call对象。