2009-08-28 51 views
0

我正在爲我的計算機接收/撥打電話時編寫單元測試。計算機擁有國家的單元測試

正在測試的方法是處理傳入/傳出呼叫的事件。如果主叫方不是經批准的主叫方,則該呼叫將被拒絕。

該代碼工作正常,但我真的找不到任何東西來測試我的單元測試。問題在於,「如果我的電腦在通話中」的實際狀態是而不是我按班級控制。只有電腦知道電話當前是否連接。

我希望有一些單元測試大師在那裏可以告訴我該做什麼來測試這種情況。我不想創建一個與我的代碼無關的虛擬變量,只是爲了讓我的單元測試通過。

爲了使這個多一點具體的,這裏是我的單元測試:

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

你能對你的來電詳談,CallState和CallInfoState類呢? – bryanbcook

+0

在rhis情況下,他們什麼都不做。在真正的通話中,他們將擁有通話信息和處理通話。我使用它們是爲了獲得當前的呼叫者號碼(我剛剛意識到我沒有投入到我的單元測試中)。它們不會被其他東西讀取,所以我不能用它們來取回一個值(而且它們不是通過引用傳遞的) – Vaccano

回答

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

我有我的代碼改變這一點,因爲電話有一個內部的構造:

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

以下幾件事情你可以做:

  1. 您可以創建一個模擬的WhiteList集合,該集合將包含一組PhoneContacts,然後使用Pho調用OnIncomingCall neContacts是或不在WhiteList中,然後檢查CallMonitor(或Call對象本身,我想)來查看呼叫是否處於正確狀態。因此Assert.IsTrue(call.IsConnected)或Assert.IsFalse(call.IsConnected)取決於您正在測試的場景。
  2. 您還可以看到該方法是否處理了在調用此方法的位置處爲null或處於不正確狀態的Call對象。
1

它被稱爲依賴性注射。您可以使您的代碼在模仿真實Phone API的界面上運行,併爲測試提供您自己的可控實施。有像Spring.Net這樣的系統可以讓這件事更容易做到。