Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用计算机拥有的状态进行单元测试_C#_Visual Studio_Unit Testing - Fatal编程技术网

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

以下是您可以做的几件事:

  • 您可以创建一个模拟白名单集合,该集合将包含一组特定的PhoneContacts,然后使用白名单中的PhoneContacts或不在白名单中的PhoneContacts调用OnIncomingCall,然后检查CallMonitor(或者我想是call对象本身)以查看调用是否处于正确状态。因此,Assert.IsTrue(call.IsConnected)或Assert.IsFalse(call.IsConnected)取决于您正在测试的场景
  • 您还可以看到该方法是否处理null的调用对象,或者在调用该方法的点处该对象的状态不正确

  • 以下是您可以做的几件事:

  • 您可以创建一个模拟白名单集合,该集合将包含一组特定的PhoneContacts,然后使用白名单中的PhoneContacts或不在白名单中的PhoneContacts调用OnIncomingCall,然后检查CallMonitor(或者我想是call对象本身)以查看调用是否处于正确状态。因此,Assert.IsTrue(call.IsConnected)或Assert.IsFalse(call.IsConnected)取决于您正在测试的场景
  • 您还可以看到该方法是否处理null的调用对象,或者在调用该方法的点处该对象的状态不正确

  • 这叫做依赖性注射。您让代码在模拟真实电话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();
        }