我正在为我的电脑接听/拨打电话进行单元测试。
正在测试的方法是处理传入/传出呼叫的事件。如果呼叫者不是被批准的呼叫者,则拒绝该呼叫。
代码工作正常,但我无法找到任何可以测试我的单元测试的东西。问题是“如果我的计算机处于通话中”的实际状态是不按类控制我。只有计算机才知道当前是否有呼叫连接。
我希望有一些单元测试大师可以告诉我如何测试这个场景。我不想创建一个与我的代码无关的虚拟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();
}
答案 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)
以下是您可以做的几件事: