[英]How do I create test states with unit testing when those states are internal properties?
[英]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这样的系统可以使此操作更容易实现。
您可以执行以下几项操作:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.