C# 使用计算机拥有的状态进行单元测试
我正在编写一个单元测试,用于测试我的计算机何时接收/拨打电话 正在测试的方法是处理传入/传出呼叫的事件。如果呼叫者不是经批准的呼叫者,则该呼叫将被拒绝 代码运行得很好,但是我真的找不到任何东西来测试我的单元测试。问题是“我的计算机是否正在通话”的实际状态是由我的班级控制的。只有计算机知道当前是否连接了呼叫 我希望有一些单元测试专家可以告诉我如何测试这个场景。我不想创建一个与我的代码无关的虚拟变量,只是为了让我的单元测试通过 为了让这更具体一点,这里是我的单元测试:C# 使用计算机拥有的状态进行单元测试,c#,visual-studio,unit-testing,C#,Visual Studio,Unit Testing,我正在编写一个单元测试,用于测试我的计算机何时接收/拨打电话 正在测试的方法是处理传入/传出呼叫的事件。如果呼叫者不是经批准的呼叫者,则该呼叫将被拒绝 代码运行得很好,但是我真的找不到任何东西来测试我的单元测试。问题是“我的计算机是否正在通话”的实际状态是由我的班级控制的。只有计算机知道当前是否连接了呼叫 我希望有一些单元测试专家可以告诉我如何测试这个场景。我不想创建一个与我的代码无关的虚拟变量,只是为了让我的单元测试通过 为了让这更具体一点,这里是我的单元测试: private Dev
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);
}
以下是您可以做的几件事:
以下是您可以做的几件事:
这叫做依赖性注射。您让代码在模拟真实电话api的界面上运行,并为测试提供自己的可控实现。有一些像Spring.Net这样的系统使这项工作更容易完成。它被称为依赖注入。您让代码在模拟真实电话api的界面上运行,并为测试提供自己的可控实现。有一些像Spring.Net这样的系统可以使这项工作变得更容易。结果是我对Rhino Mock了解得不够。可以找到这个问题的答案 这是我的代码,包含了这个答案 单元测试:
[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);
}
原来我对犀牛嘲弄的了解还不够。可以找到这个问题的答案 这是我的代码,包含了这个答案 单元测试:
[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、CallState和callinfo类做什么吗?在rhis的情况下,它们什么都不做。在实际通话中,他们会获得通话信息和处理通话的权限。我使用它们来获取当前的呼叫者号码(我刚刚意识到我没有将其输入到我的单元测试中)。它们不被其他任何东西读取,所以我不能使用它们来获取值(并且它们不是通过引用传递的)。您能详细说明一下您的Call、CallState和callinfo类的功能吗?在rhis的情况下,它们什么都不做。在实际通话中,他们会获得通话信息和处理通话的权限。我使用它们来获取当前的呼叫者号码(我刚刚意识到我没有将其输入到我的单元测试中)。它们不被其他任何东西读取,因此我无法使用它们来获取值(并且它们不是通过引用传递的)
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();
}