C:我应该对依赖.NETFramework静态方法的方法进行单元测试吗?如果是,如何测试?

C:我应该对依赖.NETFramework静态方法的方法进行单元测试吗?如果是,如何测试?,.net,unit-testing,.net,Unit Testing,我有一个WPF窗口,它只显示statis数据以及计算机的活动IPv4地址。构建时,ViewModel在单独的线程中调用以下代码: private void GetIpAddresses() { var resultList = new List<string>(); if (NetworkInterface.GetIsNetworkAvailable() != false) { foreach (var item

我有一个WPF窗口,它只显示statis数据以及计算机的活动IPv4地址。构建时,ViewModel在单独的线程中调用以下代码:

private void GetIpAddresses()
{
        var resultList = new List<string>();
        if (NetworkInterface.GetIsNetworkAvailable() != false)
        {
            foreach (var item in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (item.NetworkInterfaceType != NetworkInterfaceType.Loopback &&
                    item.OperationalStatus == OperationalStatus.Up)
                {
                    resultList.AddRange(from address in item.GetIPProperties().UnicastAddresses
                        where address.Address.AddressFamily == AddressFamily.InterNetwork
                        select address.Address.ToString());
                }
            }
        }
        IpAddresses = FormatIpAddresses(resultList);
}
IPAddresss绑定到视图中的控件,仅此而已

我想知道是否应该对这段代码进行单元测试。这更像是一个集成测试,但即使这样,我也不知道如何假装拥有/没有活动的IPv4地址

但是如果我真的想进行单元测试,我将如何模拟对.Net framework的静态方法调用,例如NetworkInterface.GetIsNetworkAvailable

我可以创建自己的包装器类,只需调用静态方法、提取接口和创建模拟。但是,如果我在应用程序的其余部分进一步采用这种策略,我将在.Net framework周围创建许多冗余包装器


我还可以让getipaddress方法接受两个委托,一个返回到is network available的答案,另一个返回所有网络接口。但是,这个方法的真正调用方实际上必须将其逻辑的一半传递给getipaddress,这打破了关注点分离的整个概念。。。不是吗?

您可能不应该像现在这样进行单元测试;有一行代码值得进行单元测试,因为其他所有内容都是.Net框架

resultList.AddRange(from address in item.GetIPProperties().UnicastAddresses
                        where address.Address.AddressFamily == AddressFamily.InterNetwork
                        select address.Address.ToString());
这个测试实际上是为了确保您将找到的任何地址添加到将要返回的列表中

要做到这一点,您需要使这个方法成为一个返回listi.e的查询。这样,您可以验证返回的值是否正确,并将其公开,以便进行测试;是的,您需要围绕框架调用创建一个包装器

但在这种情况下,这值得麻烦吗?我不这么认为

然而 我想说,将它从一个私有方法转移到一个单独的依赖项是值得的,例如INetworkAddressLister和方法IEnumerable GetNetworkAddresses,您可以将它注入任何使用它的类中。 然后,在测试消费者时,您至少可以对其进行模拟或存根

您说这直接绑定到UI中的一个控件,它是一个使用者,但这里有另一个使用者-包含此代码的类的单元测试,它应该是它的第一个使用者:

相关: