【问题标题】:How to unit test code that contains Environment.OSVersion.Version如何对包含 Environment.OSVersion.Version 的代码进行单元测试
【发布时间】:2016-01-14 16:52:27
【问题描述】:

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

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

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

【问题讨论】:

  • 显然有很多关于此主题的现有问题,例如stackoverflow.com/questions/6499871/… - 请务必解释为什么现有建议对您不起作用。
  • @AlexeiLevenkov 您链接的答案没有提到 MS Fakes - 大多数答案只是说要包装,这个问题明确拒绝。此外,它比普通的假货要复杂一些,因为您必须编辑mscorlib.fakes 配置文件,所以我认为值得回答。就个人而言,我会将支票包装起来,这样我就不必使用 Fakes,但它始终是一个强大的了解工具。
  • @RB。说 OP 根本没有搜索是不礼貌的,所以我试着做得更好一些......像bing.com/search?q=C%23+unittest+static+method 这样的一些基本搜索带来了几个 SO 答案,包括 stackoverflow.com/questions/10632975/… 指的是 Moles/Fakes 作为一个选项以及几个注射选项......(实际上我什至不确定我想对这些 cmets 说什么......显然 21 次观看意味着无论如何都没有多少人关心这个帖子 :))

标签: c# unit-testing


【解决方案1】:

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

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

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

为 System 添加一个 Fakes 程序集:

打开“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);
    }
}

【讨论】:

  • 谢谢 RB,很棒的信息
猜你喜欢
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多