【问题标题】:Unit Testing With Computer Owned States计算机拥有状态的单元测试
【发布时间】:2009-08-28 20:59:50
【问题描述】:

我正在为我的计算机何时接收/拨打电话编写一个单元测试。

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

代码运行良好,但我真的找不到任何东西可以针对我的单元测试进行测试。问题是“我的计算机是否在通话中”的实际状态不是由我控制的。只有计算机知道当前是否接通了呼叫。

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

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

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

【问题讨论】:

  • 您能详细说明您的 Call、CallState 和 CallInfoState 类的作用吗?
  • 在这种情况下,他们什么都不做。在真正的通话中,他们将拥有通话信息并处理通话。我使用它们是为了获取当前的呼叫者号码(我刚刚意识到我没有将其输入到我的单元测试中)。它们不会被其他任何东西读取,因此我无法使用它们来获取值(并且它们不是通过引用传递)

标签: c# visual-studio unit-testing


【解决方案1】:

原来我对 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();
    }

【讨论】:

    【解决方案2】:

    这称为依赖注入。你让你的代码作用在一个模仿真实电话 api 的接口上,并为测试提供你自己的可控实现。有像 Spring.Net 这样的系统可以让这更容易做到。

    【讨论】:

      【解决方案3】:

      您可以做以下几件事:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-04
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        相关资源
        最近更新 更多