c# - 如何对包含 Environment.OSVersion.Version 的代码进行单元测试

标签 c# unit-testing

我正在对一些检查当前操作系统版本的代码进行单元测试,因为 dll 中的方法只能在 Windows 7 上运行。为此,使用了以下内容

if (Environment.OSVersion.Version >= new Version("6.2"))
    //Windows 8
else
    //Windows 7

是否有一种简单的方法对此进行单元测试,或者是否需要更改代码(包装并注入(inject)环境?)

最佳答案

您可以使用 Microsoft Fakes(假设您拥有 Visual Studio 的终极版)。

https://msdn.microsoft.com/en-us/library/hh549175.aspx

这将允许您伪造静态方法:)

为系统添加一个 Fakes 程序集: Fakes solution explorer

打开“Fakes → mscorlib.fakes”并将其编辑为如下所示:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
  <Assembly Name="mscorlib" Version="4.0.0.0"/>
  <ShimGeneration>
    <Add FullName="System.Environment"/>
  </ShimGeneration>
</Fakes>

执行构建。

您现在可以编写单元测试了:

[TestMethod]
public void TestMethod1()
{
    using (ShimsContext.Create())
    {
        System.Fakes.ShimEnvironment.OSVersionGet = () => new OperatingSystem(PlatformID.Win32Windows, new Version("99.99"));

        Assert.AreEqual(Environment.OSVersion.Version.Major, 99);
    }
}

关于c# - 如何对包含 Environment.OSVersion.Version 的代码进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34795234/

相关文章:

c# - 替换 Net Core 中的 AppDomain

c# - WPF:ObservableCollection 内存泄漏

c# - IE8/IE9 工具栏 Cookie 检查

c# - 由于 'System.DateTime' 准确度,成组运行时单元测试运行速度过快

swift - Quick-Nimble 框架中是否有等效的 XCTFail()?

java - 如何使用Gradle覆盖android测试路径?

java - 如何模拟返回模拟对象的方法

c# - 如何将 GET 函数传递到 View/ViewModel?如何将数据绑定(bind)到 View (仅使用 C# 代码)?

c# - 数组中的任务——只有最后一个运行

java - 使用 JUnit 测试服务器